PHP: <?php define('X', 'GLOBALS'); var_dump(${X}); // $GLOBALS function a() { var_dump(${X}); } a(); // NULL $x = create_function('', 'var_dump(${X});'); $x(); // NULL ?> Почему NULL?
Warning Please note that variable variables cannot be used with PHP's Superglobal arrays within functions or class methods. The variable $this is also a special variable that cannot be referenced dynamically.
Спасибо, маэстро. Только вот почему ${'GLOBALS'} проходит? И почему define('X', 'GLOBALS'); ${X} не проходит..?
Смотри, ВНЕ функции у нас работает как вариант var_dump(${'GLOBALS'}); так и var_dump(${X}); Внутри функции работает только вариант var_dump(${'GLOBALS'}); То есть логично предположить что дело в константе, что она каким-то образом не читается / теряется. Проверяем: function a(){echo X;} Константа на месте! Тогда какого хрена, PHP?
потому что ${X} не глобальная переменная и чтобы использовать ее в функции, ее нужно глобализовать. PHP: <?php define('X', 'GLOBALS'); var_dump(${X}); // $GLOBALS function a() { global ${X}; var_dump(${X}); } a(); // NULL $x = create_function('', 'var_dump(${X});'); $x(); // NULL ?> http://php.net/manual/ru/language.variables.scope.php
100% в видимости. Фишка в том, что ты выводишь не непосредственно $GLOBALS, а именно новую переменную ${X}. То же самое если ты сделаешь так. PHP: $aaa = 'aaaaaaaa'; define('X', 'aaa'); var_dump(${X}); function a() { var_dump(${X}); } a(); а потом PHP: $aaa = 'aaaaaaaa'; define('X', 'aaa'); var_dump(${X}); function a() { global ${X}; var_dump(${X}); } a();
Константы видимы отовсюду. Это раз. $GLOBALS виден тоже отовсюду, это два. Тогда вопрос - зачем нужно юзать global?
В чем смысл темы? Если считаете, что это баг - вперед на php.net репортить, именно так писать не выходит, альтернативные варианты приводились в теме. Так чего ждем? Указания на конкретную строку в исходниках пхп, которая препятствует такому финту?
я думаю, всё кроется в конструкции ${'VAR'}, вызванной изнутри функции. Как-то тут неясно области видимости работают. Почитайте об этом.