Запретить доступ к определенной переменной из глобальной области видимости

#php #oop #global-variables #php-5.3

#php #ооп #глобальные переменные #php-5.3

Вопрос:

Есть ли способ запретить выбор переменной из глобальной области видимости?

Что-то вроде:

 #index.php
$forbidden = 'you should not be able to access me outside this scope'; // maybe invoke a function or namespaces?
require 'stuff.php';
echo new stuff();

#stuff.php
class stuff
{
    public function __toString()
    {
        global $forbidden; // to result in an error or something?
        /*
            just a random example, but yes, any way
            to somehow make a variable not global?
        */
        return 'I am forbidden';
    }
}
 

Понятия не имею, возможно ли это, но в любом случае, интересует только мода на ООП.

Причина?

Запретить создание экземпляра определенного класса в переменной, а затем удаление его из глобальной области видимости для повторного использования его функций. Сделайте класс полностью «частным», что-то вроде мастер-класса, который выполняет всю автоматизацию.

Надеюсь, я ясно выразился.

Комментарии:

1. Я не думаю, что есть способ сделать это без a debug_backtrace() , что ужасно дорого. Хотя это звучит довольно эзотерично — есть ли у вас конкретная причина запретить это на уровне кода? Вместо того, чтобы просто определять это как правило кодирования?

2. Хорошо, если есть один класс, который автоматически создает процедуру страницы. Например, 1) посмотреть, действителен ли запрос, 2) получить все необходимые данные и 3) автоматически отобразить все это. Разрешить модификацию приложения только с помощью библиотек и плагинов, которые не могут получить глобальный доступ к этой переменной / классу для запуска цикла. Я мог бы вообще не определять ее как переменную, но должен быть способ позволить стороннему разработчику принудительно выполнять запрос с помощью отладки / профилирования перед выполнением мастер-класса. (вкратце)

Ответ №1:

Единственный способ, который я могу придумать, — это «подделать» глобальную область видимости…

 //index.php
function scope() {
    require 'actual.php';
}
scope();
 

и теперь, вводя код в actual.php выглядит как «обычный» код, но на самом деле он находится внутри области действия функции. Очевидно, что вы не можете объявлять функции или классы в actual.php теперь, но в остальном он ведет себя так же, за исключением того, что любые объявленные переменные будут находиться в области действия функции, а не в глобальной области.

Я действительно не стал бы этого делать. Избиение палкой обычно работает, если кто-то делает что-то глупое, например, такие глобальные переменные 😉

Комментарии:

1. Ну, всегда есть те ребята, которые просто не соблюдают правила, или не понимают документацию, или просто хотят поэкспериментировать. Но интересная идея..

2. Мне нравится этот ответ. В первую очередь не загрязняйте глобальное пространство. 🙂

3. @Tom Если вы боитесь, что ваши коллеги что-то сломают — они смогут что-то сломать, что бы вы ни делали.

4. Не то, чтобы я боялся, что люди что-то сломают, а просто сохранить код в чистоте. Я уверен, что 70% разработчиков, использующих фреймворк, используют его неправильно. Как, например, Symfony… Они создали фреймворк, задокументировали его и т. Д., Случайный парень, который думает, что он профессионал, избегает документации, использует Symfony как «расширение» для написания приложения по-своему. Приложение работает, но, в конце концов, похоже, что ему не нужен Symfony, ему нужно просто расширение PHP, которое включало бы некоторые функции Symfony.

5. Что ж, тогда, как предложил Джани: если вы хотите сохранить свой код чистым, не загрязняйте глобальную область видимости.