Я поддерживаю библиотеку, записанную для PHP 5.2, и я хотел бы создать 5.3-namespaced версию PHP его. Однако я также усовершенствовал бы non-namespaced версию, пока PHP 5.3 так не стареет, это даже Debian стабильные поставки она ;)
У меня есть довольно чистый код, приблизительно 80 классов после Project_Directory_Filename
схема именования (я изменил бы их на \Project\Directory\Filename
конечно) и только немного функций и констант (также снабженный префиксом название проекта).
Вопрос: что лучший способ состоит в том, чтобы разработать namespaced и non-namespaced версии параллельно?
Должен я просто создать, подцепляют репозиторий на вилку и продолжают объединять изменения между ответвлениями? Есть ли случаи, где опрыснутый обратной косой чертой код становится твердым объединиться?
Я должен записать сценарий, который преобразовывает 5,2 версий в 5,3 или наоборот? Я должен использовать токенизатор PHP? sed
? C препроцессор?
Существует ли лучший способ использовать пространства имен, где доступный и сохраняют назад совместимость с более старым PHP?
Обновление: Отклоненный использование пространств имен, в конце концов.
Не думаю, что препроцессирование кода 5.3 - отличная идея. Если ваш код функционально идентичен и в PHP 5.2, и в 5.3, за исключением использования пространств имен вместо префиксов, разделенных подчеркиванием, зачем вообще использовать пространства имен? В этом случае мне кажется, что вы хотите использовать пространства имен ради использования пространств имен...
Я думаю, что при переходе на пространства имен, вы начнете "думать немного по-другому" об организации своего кода.
По этой причине я полностью согласен с вашим первым решением. Создайте вилку и сделайте бэкпорты возможностей и исправлений ошибок.
Удачи!
Ну, я не знаю, "лучший" ли это способ, но теоретически, вы могли бы использовать скрипт для переноса кода 5.3 и обратного переноса его в 5.2 (потенциально даже с помощью PHP).
В ваших файлах пространства имен вы хотели бы сделать что-нибудь преобразующее:
namespace \Project\Directory\Filename;
class MyClass {
public $attribute;
public function typedFunction(MyClass $child) {
if ($child instanceof MyClass) {
print 'Is MyClass';
}
}
}
Во что-то вроде:
class Project_Directory_Filename_MyClass {
public $attribute;
public function typedFunction(Project_Directory_Filename_MyClass $child) {
if ($child instanceof Project_Directory_Filename_MyClass) {
print 'Is MyClass';
}
}
}
А в вашем коде пространства имен вам нужно было бы преобразовать из:
$myobject = new Project\Directory\Filename\MyClass();
В:
$myobject = new Project_Directory_Filename_MyClass();
Хотя все ваши включает
и требует
останутся прежними, я думаю, что вам почти понадобилось бы оставить какой-нибудь кэш всех ваших классов и пространств имен, чтобы сделать сложное преобразование вокруг 'instanceof' и набрать параметры, если вы их используете. Это самая хитрая вещь, которую я вижу.
Ни то, ни другое. Если бы это была реализация плавающей точки, она была бы подвержена тем же неточностям, что и типы FLOAT и REAL. Смотрите Плавающий пункт в википедии.
ДЕНЬГИ - фиксированный тип пункта .
Это один байт меньше, чем ДЕСЯТИЧНЫЙ (19,4), потому что он имеет меньший диапазон (от 922 337 203 485 477,5808 до 922 337 203 685 477,5807) в отличие от (-10 ^ 15 + 1 до 10 ^ 15-1).
-121--2439225-С помощью 3 Client .x необходимо выполнить следующее:
Protocol easyHttps = new Protocol("https", new EasySSLProtocolSocketFactory(), 443);
Protocol.registerProtocol("https", easyHttps);
С реализацией EasySSLProtocolSocketFactory можно ознакомиться здесь .
-121--1263128-Вот что я нашел:
Делать это с регулярными выражениями - кошмар. Вы можете сделать большую часть этого с помощью нескольких простых выражений, но тогда краевые случаи являются убийством. Я оказался в ужасном, хрупком беспорядке, который едва работает с одной кодовой базой.
Это возможно благодаря встроенному токенизатору и простому синтаксическому анализатору рекурсивного спуска, который обрабатывает только упрощенное подмножество языка.
Я закончил с довольно уродливым дизайном (синтаксический анализатор и трансформатор в одном - в основном просто изменение или переиздание токенов), потому что это казалось слишком большой работой, чтобы построить полезное синтаксическое дерево с поддерживаемым пробелом (я хотел, чтобы результирующий код был читаемым человеком).
Я хотел попробовать phc
для этого, но не смог убедить его настроить
, что я создал требуемую версию библиотеки Boost.
Я еще не пробовал ANTLR для этого, но это, вероятно, лучший инструмент для такого рода задач.
Я не тестировал это самостоятельно, но вы можете взглянуть на этот скрипт преобразования php 5.2 -> php 5.3 .
Это не то же самое, что 5.3 -> 5.2, но, возможно, вы найдете там полезные вещи.