Стратегия разработки namespaced и non-namespaced версий того же кода PHP

Я поддерживаю библиотеку, записанную для 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?


Обновление: Отклоненный использование пространств имен, в конце концов.

49
задан hakre 18 April 2013 в 05:20
поделиться

4 ответа

Не думаю, что препроцессирование кода 5.3 - отличная идея. Если ваш код функционально идентичен и в PHP 5.2, и в 5.3, за исключением использования пространств имен вместо префиксов, разделенных подчеркиванием, зачем вообще использовать пространства имен? В этом случае мне кажется, что вы хотите использовать пространства имен ради использования пространств имен...

Я думаю, что при переходе на пространства имен, вы начнете "думать немного по-другому" об организации своего кода.

По этой причине я полностью согласен с вашим первым решением. Создайте вилку и сделайте бэкпорты возможностей и исправлений ошибок.

Удачи!

9
ответ дан 7 November 2019 в 11:58
поделиться

Ну, я не знаю, "лучший" ли это способ, но теоретически, вы могли бы использовать скрипт для переноса кода 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' и набрать параметры, если вы их используете. Это самая хитрая вещь, которую я вижу.

.
0
ответ дан 7 November 2019 в 11:58
поделиться

Ни то, ни другое. Если бы это была реализация плавающей точки, она была бы подвержена тем же неточностям, что и типы 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 для этого, но это, вероятно, лучший инструмент для такого рода задач.

1
ответ дан 7 November 2019 в 11:58
поделиться

Я не тестировал это самостоятельно, но вы можете взглянуть на этот скрипт преобразования php 5.2 -> php 5.3 .

Это не то же самое, что 5.3 -> 5.2, но, возможно, вы найдете там полезные вещи.

-1
ответ дан 7 November 2019 в 11:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: