Intereting Posts
Какой хэш используют сеансы PHP при хранении идентификатора? zend gdata picasa php api перестала работать Как обрабатывать динамическое число параметров в querystring при создании REST api? Сравнение двух дат Может ли модель ссылаться на представление в базе данных вместо таблицы в CakePHP? Есть ли стандартный способ поменять запрос из идентификатора на другой столбец, например «имя»? Не удается подключиться к базе данных (000webhost) Простые тесты ZF2 для контроллера с использованием ZfcUser Размещение события на стене страницы с PHP – правильная страница? Использование javascript history.back () не работает в Safari .. как мне сделать его кросс-браузер? Как запретить другим пользователям отправлять свои собственные данные на мою php-страницу? Извлечение только даты из поля datetime (mysql) и назначение его переменной php Программно создавая CMS / страницу в Magento Как настроить Zend 2 на сервере хостинга? MongoCursorTimeoutException для агрегатной функции

Сделать все переменные глобальными, PHP

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

Импортировать все глобальные переменные, включая. суперглобалы и сопоставление имен параметров в области функций:

extract($GLOBALS, EXTR_REFS | EXTR_SKIP); 

Проблема в том, что здесь суперглобалы . Вы можете исключить их, вот список (PHP 5.2):

 /** * PHP Superglobals */ array ( 1 => 'GLOBALS', 2 => '_ENV', 3 => 'HTTP_ENV_VARS', 4 => '_POST', 5 => 'HTTP_POST_VARS', 6 => '_GET', 7 => 'HTTP_GET_VARS', 8 => '_COOKIE', 9 => 'HTTP_COOKIE_VARS', 10 => '_SERVER', 11 => 'HTTP_SERVER_VARS', 12 => '_FILES', 13 => 'HTTP_POST_FILES', 14 => '_REQUEST', 15 => 'HTTP_SESSION_VARS', 16 => '_SESSION', ) 

Вы получаете имена переменных переменных с помощью get_defined_vars .

Это также причина, по которой противоположность менее get_defined_vars , get_defined_vars не возвращает суперглобалы, а только локальные переменные.

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

 foreach(get_defined_vars() as ${"\x00\x00"} => ${"\x00\x01"}) { $GLOBALS[${"\x00\x00"}] =&$${"\x00\x00"}; } 

Обратите внимание, что подобно globals массивам суперглобальный массив $GLOBALS содержит ссылки на глобальные переменные, поэтому это также создает ссылки здесь. Это особенно необходимо, если вы импортируете через global или &$GLOBALS[...] или extract как extract выше. Или если у вас есть локальные переменные, которые являются псевдонимами для частных членов класса (не делайте этого;)):

Пример / демонстрация :

 <?php /** * Make all variables global, PHP * @link http://stackoverflow.com/q/1909647/367456 */ error_reporting(~0); function bar($goo = 1) { global $foo; $foo++; $baz = 3; foreach(get_defined_vars() as ${"\x00\x00"} => ${"\x00\x01"}) { $GLOBALS[${"\x00\x00"}] =&$${"\x00\x00"}; } } $foo = 1; bar(); echo '$goo: ', var_dump($goo); # int(1) echo '$foo: ', var_dump($foo); # int(2) echo '$baz: ', var_dump($baz); # int(3) 

Неважно, что вы пытаетесь сделать, но это плохой путь. Вам будет намного лучше передавать переменные в качестве аргументов в функции или объявлять их глобальными.

но, короче говоря, нет простого способа сделать это без большого количества глобальных операторов.

Быстрый и грязный способ:

 $GLOBALS += get_defined_vars(); 

Я не знаю, переносится ли этот хак (он работает на PHP 5.3.1), и я подозреваю, что объекты клонированы.

Я думаю, что это может помочь foreach($GLOBALS as $name => $value) global $$name; поместите его внутри функции, и вы будете иметь все определенные переменные видимости

Вы можете просто сделать их ссылкой на $ GLOBALS

 foreach($GLOBALS as $k => $v) $$k=&$GLOBALS[$k]; 

Объяснение кода:

$ GLOBLAS – сверхглобальная переменная (видимая везде). В основном он содержит все переменные


$$ означает переменную с именем значения переменной, которую вы написали

Немного странно объяснять на иностранном языке, вот пример:

 $color='blue'; $blue='foo'; echo $$color; 

выйдет

 foo 

 $k=& $v; 

означает, что $ k является ссылкой на $ v

Это не очень хорошая практика, чтобы сделать все переменные GLOBAL в отношении безопасности. Чтобы добавить переменные как глобальные, вам придется добавлять ключевое слово GLOBAL каждый раз, когда вы собираетесь получать доступ. Альтернативный подход – использование массива $ GLOBAL.