Вопрос
Я только что обновился до PHP 5.3 и начал поддерживать старый веб -сайт для нового клиента. Кажется, он использует довольно нечетный код PHP, который я не сталкивался раньше.
В то время как попытка получить доступ к переменным $ _get или $ _request, разработчик использовал следующее: $ {"variable_name"}
Я получаю уведомления, сгенерированные из -за неопределенных переменных (предположительно, потому что PHP не анализирует $ {"variable_name"} код стиля).
Изменить это на $ _Request ['variable_name' Работает, как и ожидалось, но я не могу пройти весь их код и изменить его, так как сайт является массивным и использует методы макета владения.
Кто -нибудь знает, можно ли включить поддержку этих тегов / кодовых блоков? Я посмотрел на Php.ini, и есть упоминание о битках стиля ASP и коротких мечениях, но позволяя им не иметь никакого эффекта (они все равно выглядят совершенно иначе, я просто подумал, что это стоит шансов).
Решение
Я не думаю, что с этим синтаксисом есть что -то новое:
$a = 10;
var_dump(${"a"});
Работает просто отлично ;-)
Ваша проблема, вероятно, связана с тем, что до, прежде, register_globals
был включен (по умолчанию, если php <= 4., и теперь отключен - и это хорошо для безопасности!
С register_globals, установленным на ON, любая переменная в $_REQUEST
автоматически вводится как увлечение в вашем приложении - Ну, на самом деле это зависит от variables_order
Вариант конфигурации, но этот почти всегда включает в себя, по крайней мере, пост и cookie.
Например, если есть переменная, подобная $_GET['my_var']
, у вас также будет $my_var
переменная ... и это также можно получить с помощью синтаксиса ${'my_var'}
Учитывая register_globals
является Off
По умолчанию, чем что -то вроде PHP 4.2, и должно исчезнуть в PHP 6 (если я правильно помню), Я бы посоветовал против повторного активирования ... по крайней мере, если у вас есть время, необходимое для исправления / проверки кода ...
Другие советы
Синтаксис Curly Brace для переменных является встроенной частью PHP и существует уже довольно некоторое время. Причина, по которой он существует, заключается в разрешении неоднозначности с массивами и синтаксисами объектов при использовании переменные переменные.
Из руководства:
Чтобы использовать переменные переменные с массивами, вы должны решить проблему двусмысленности. То есть, если вы пишете $$1 Тогда анализатор должен знать, если вы хотите использовать $ A1 как переменная, или если вы хотели $$ A в качестве переменной, а затем 1 Индекс из этой переменной. Синтаксис для разрешения этой неоднозначности: $ {$ a1} для первого случая и $ {$ a}1 для второго.
Это очень удобный синтаксис в нескольких ситуациях, таких как использование переменных массива или объекта при выводе чего -либо, используя Синтаксис Heredoc.
Я не буду повторять совет других об использовании register_globals
, Я просто хотел объяснить этот необычный синтаксис.
Синтаксис $ {"variable_name"} практически такой же, как $ variable_name, за исключением того, что содержимое вьющиеся скобки оценивается в первую очередь. Он поддерживается всеми недавними версиями PHP, даже бета -версиями. То, что не поддерживается недавними версиями PHP, так это поддержка регистрации переменных $ _Request (и других) в качестве глобальных переменных. Есть настройка для его включения:
register_globals = on
Это не рекомендуется для использования производства из -за проблем безопасности. Может быть проще запустить вас источником через какой-то Sed'-подобный инструмент и заменить использование регулярным выражением.
Старый сервер, вероятно, имеет REGISTER_GLOBALS
на. Так что странные кронштейны не проблема.
REGISTER_GLOBALS
ставит все переменные в $_REQUEST
как обычные переменные в глобальном объеме, то есть вы можете получить доступ $_REQUEST['test']
можно получить доступ к $test
или же ${"test"}
Синтаксис кронштейна включен по умолчанию, и я не верю, что вы можете включить/выключить.
register_globals
вероятно, включилось. {$variable_name}
Синтаксис всегда включен, но register_globals
поворачивает вещи вроде $_REQUEST['variable_name']
в $variable_name
.
Избегайте переключения его, если это вообще возможно - есть причина, по которой это было давно рекомендовано, и это полностью уходит в PHP6.
register_globals
Умерен по состоянию на Php 5,3 и будет удален с PHP 6,0. Что вы хотите сделать, так это использовать функцию рефакторинга, найденная в большинстве PHP IDE (Zendo Studio 6+), чтобы переименовать переменную в нечто более подходящее, т.е. $_GET['variable_name']
.