Удаление / отображение пространства имен PHP и перезапись идентификаторов

Я пытаюсь автоматизировать удаление пространств имен из коллекции классов PHP, чтобы сделать их совместимыми с PHP 5.2. (Провайдеры виртуального хостинга делают это не причудливые мошеннические установки PHP 5.3. Не знаю почему. Также в рассматриваемом коде не используются какие-либо дополнения функций 5.3, только этот синтаксис. Автоконверсия кажется проще, чем делать это вручную или повторно реализовывать кодовую базу.)

Для переписывания * Скрипты .php Я в основном использую список tokenizer . Поиск идентификатора + объединение уже завершено. Но сейчас я немного запутался, как выполнить реальную переписывание.

function rewrite($name, $namespace, $use) {

    global $identifiers2;            // list of known/existing classes

    /*
        bounty on missing code here
    */

    return strtr($name, "\\", "_");  // goal: backslash to underscore
}

Эта функция будет вызываться для каждого найденного идентификатора (будь то класс, функция или константа). Он получит некоторую контекстную информацию для преобразования локального идентификатора в абсолютное / глобальное $ name:

$name =
    rewrite(
        "classfuncconst",      # <-- foreach ($names as $name)
        "current\name\space",
        array(
           'namespc' => 'use\this\namespc',
           'alias' => 'from\name\too',
           ...
        )
    );

На этом этапе я уже подготовил список $ identifiers2 . Он содержит список всех известных классов, функций и имен констант (здесь для простоты объединены).

$identifiers2 = array(             // Alternative suggestions welcome.
   "name\space\Class" => "Class",  // - list structure usable for task?
   "other\ns\func1" => "func1",    // - local name aliases helpful?
   "blip\CONST" => "CONST",        // - (ignore case-insensitivity)

Параметр $ name , полученный функцией rewrite () , может быть локальным , неквалифицированным , \ абсолютный или имя \ пробел идентификатор (но только идентификаторы, без выражений). Список $ identifiers2 имеет решающее значение для разрешения неквалифицированных идентификаторов, которые могут относиться к вещам в текущем пространстве имен или, если они не найдены там, глобальным вещам.

И различные ] use namespace псевдонимы должны быть приняты во внимание и добавить некоторые сложности помимо правил разрешения пространства имен и приоритета.

Итак, как / в каком порядке вы бы попытались преобразовать здесь варианты имен классов / функций?

Mental Laziness Bounty.

Чтобы сделать это менее вопиющим вопросом plzsendtehcodez: поясняющий список инструкций или псевдо- кодовый ответ тоже будет иметь право. И если для этой задачи больше подходит другой подход, пожалуйста, подробнее об этом. (Но нет, обновление PHP или изменение хостера не вариант.)

Думаю, я тем временем разобрался, но вопрос все еще открыт для ответов / предложений по реализации. (В противном случае награда, очевидно, пойдет на nikic.)

31
задан mario 2 June 2011 в 14:50
поделиться