Поддержка PHP 5.3 для странного кода '$ {}'? - PullRequest
2 голосов
/ 24 августа 2009

Я только что обновился до PHP 5.3 и начал поддерживать старый сайт для нового клиента. Кажется, он использует довольно странный PHP-код, с которым я раньше не сталкивался.

При попытке доступа к переменным $ _GET или $ _REQUEST разработчик использовал следующее: $ {"variable_name"}

Я получаю уведомления, генерируемые из-за неопределенных переменных (предположительно, потому что PHP не анализирует код стиля $ {"variable_name"} ).

Изменение этого значения на $ _ REQUEST ['variable_name'] работает, как и ожидалось, но я не могу просмотреть весь их код и изменить его, так как сайт массивный и использует собственные методы компоновки.

Кто-нибудь знает, возможно ли включить поддержку этих тегов / кодовых блоков? Я взглянул на PHP.ini, и там есть упоминания о тегах и коротких тегах в стиле ASP, но их включение не дает никакого эффекта (в любом случае, они выглядят совершенно по-другому, я просто подумал, что это стоит того).

Ответы [ 6 ]

16 голосов
/ 24 августа 2009

Я не думаю, что есть что-то новое с этим синтаксисом:

$a = 10;
var_dump(${"a"});

Работает просто отлично; -)


Ваша проблема, вероятно, связана с тем, что раньше register_globals было включено (по умолчанию, если PHP <= 4.something) </em>, и теперь отключено - и это это хорошо для безопасности!

Если для register_globals задано значение On, любая переменная в $_REQUEST автоматически вводится как переменная в вашем приложении - ну, на самом деле, это зависит от параметра конфигурации variables_order, но в этот почти всегда входят Get, Post и Cookie, по крайней мере.

Например, если есть переменная типа $_GET['my_var'], у вас также будет переменная $my_var ... И к ней также можно получить доступ с помощью синтаксиса ${'my_var'}


Учитывая, что register_globals по умолчанию Off, так как что-то вроде PHP 4.2, и должно исчезнуть в PHP 6 (если я правильно помню) , я бы посоветовал не активировать его ... по крайней мере, если у вас есть время, необходимое для исправления / проверки кода ...

5 голосов
/ 24 августа 2009

Синтаксис фигурных скобок для переменных является встроенной частью PHP и существует уже довольно давно. Причина, по которой он существует, заключается в устранении неоднозначностей с массивами и синтаксисами объектов при использовании переменных переменных .

Из руководства:

Чтобы использовать переменные переменные с массивами, вы должны разрешить проблема неоднозначности. Это если вы напишите $$ a 1 , тогда парсер должен знать, если вы хотели использовать $ a 1 в качестве переменная, или если вы хотели $$ a как переменная, а затем индекс 1 из эта переменная. Синтаксис для разрешить эту неоднозначность можно следующим образом: $ {$ a 1 } для первого случая и $ {$ a} 1 для второй.

Это очень удобный синтаксис в нескольких ситуациях, например, при использовании переменных массива или объекта при выводе чего-либо с использованием синтаксиса heredoc .

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

3 голосов
/ 24 августа 2009

Синтаксис $ {"variable_name"} практически такой же, как и $ variable_name, за исключением того, что содержимое фигурных скобок вычисляется первым. Он поддерживается всеми последними версиями PHP, даже бета-версиями. Однако последние версии PHP не поддерживают регистрацию переменных $ _REQUEST (и других) в качестве глобальных переменных. Есть настройка для его включения:

register_globals = on

Это НЕ рекомендуется для производственного использования из-за проблем безопасности. Может быть проще запустить исходный код с помощью какого-либо «подобного» инструмента и заменить обычные выражения регулярным выражением.

2 голосов
/ 24 августа 2009

register_globals, вероятно, был включен. Синтаксис {$variable_name} всегда включен, но register_globals превращает такие вещи, как $_REQUEST['variable_name'] в $variable_name.

Старайтесь не включать его, если это вообще возможно, - есть причина, по которой его давно не советуют, и он полностью исчезает в PHP6.

2 голосов
/ 24 августа 2009

На старом сервере, вероятно, включено REGISTER_GLOBALS. Так что странные скобки - не проблема.

REGISTER_GLOBALS помещает все переменные в $_REQUEST как обычные переменные в глобальную область, что означает, что вы можете получить доступ к $_REQUEST['test'], например, $test или ${"test"}

.

Синтаксис скобок включен по умолчанию, и я не верю, что вы можете включить / выключить его.

0 голосов
/ 25 августа 2009

register_globals устарела с версии 5.3 и будет удалена с версии 6.0. Что вы хотите сделать, это использовать функцию рефакторинга, которая есть в большинстве PHP IDE (zendo studio 6+), чтобы переименовать переменную в более подходящее значение, например $_GET['variable_name'].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...