Я пытаюсь автоматизировать удаление пространств имен из коллекции классов 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
}
Эта функция будет вызываться для каждого найденного идентификатора (класса, функции или const).Он получит некоторую контекстную информацию для преобразования локального идентификатора в абсолютное / глобальное $ 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()
, может быть локальным , неквалифицированным , \ absolute или name \ spaced идентификатор (но только идентификаторы, без выражений).Список $identifiers2
имеет решающее значение для разрешения неквалифицированных идентификаторов , которые могут ссылаться на вещи в текущем пространстве имен или, если их там нет, глобальные вещи.
и различные псевдонимы use namespace
должны быть приняты во внимание и добавить некоторые сложности, помимо разрешения пространства имен и правил приоритета.
Итак, как / в каком порядке вы пытаетесь преобразовать варианты названий классов / функций здесь?
Mental Laziness Bounty.
Чтобы сделать этоменее вопиющий вопрос plzsendtehcodez: список пояснительных инструкций или ответ псевдокода также будут приемлемы.И если другой подход будет более подходящим для этой задачи, пожалуйста, уточните это.(Но нет, обновление PHP или смена хостера не вариант.)
Я думаю, что пока что понял это, но вопрос все еще открыт для ответов / предложений по реализации.(В противном случае щедрость, очевидно, перейдет к nikic.)