Вопрос

Я только что обновился до 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'].

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top