Я пытаюсь автоматизировать удаление пространств имен из коллекции классов 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.)