2010-05-25 5 views
4

Так что я читал о PHP пространств имен, и я понял, что в более ранних версиях 5.3, если вы пишетесделать пространство имен обратную совместимость в PHP

namespace MyNamespace 

вы получите синтаксическую ошибку.

Есть ли способ избежать этого, то есть сделать пространства имен обратно совместимыми, поэтому код не просто сбой?

+5

Вы описываете форвардную совместимость. – webbiedave

+0

Вопрос в том, как заставить новый код работать со старыми версиями PHP. Похоже на обратную совместимость со мной ... – echo

+0

Вопрос в том, как сделать старые версии кода запуска PHP, предназначенного для более новых версий. Это передовая совместимость. – webbiedave

ответ

4

Короткий ответ: Нет

Longer Ответ: (добавлено, чтобы захватить полезную информацию от других удаленных ответов). Новый синтаксис приведет к ошибкам синтаксического анализа в PHP, поэтому вы не можете использовать обработчик ошибок клиентов, чтобы ловить ошибки, сгенерированные в версиях < 5.3. Теоретически вы могли бы написать предварительный процессор для сканирования и/или выполнить lex/parse в источнике, а затем написать что-то обратно, что было бы совместимо с PHP 5.2, но это создает больше проблем, чем решает.

0

Возможно, вы можете запросить версию используемого PHP и вызвать eval, если она достаточно высока. Я не знаю, будет ли это работать.

+0

Я не думаю, что это сработает. Пространства имен разрешаются при компиляции (хорошо разбор), тогда как eval разрешается во время выполнения ... – ircmaxell

+0

Я думал, что он может выполнять определенные макеты времени компиляции, и поэтому его нельзя вызывать из переменной функции. – Puppy

0

На самом деле, я думаю, это возможно, но я не верю, что это того стоит. Идея заключалась бы в создании настраиваемого по умолчанию stream wrapper, который будет анализировать файлы PHP в соответствии с новой грамматикой и вносить соответствующие изменения в синтаксис, чтобы он был прав PHP < 5.3.

Обертка должна заменить имена классов, такие как Foo\Bar\Baz, Foo_Bar_Baz. В настоящее время я не уверен, есть ли что-то, что сделало бы это невозможным.

В любом случае, я не считаю, что это стоит усилий. Обновите PHP 5.3.

О, это означает, что код оболочки должен быть совместим с PHP < 5.3.