Я пытаюсь автоматизировать удаление пространств имен из коллекции классов PHP, чтобы сделать их совместимыми с PHP 5.2. (Shared хостинг-провайдерам не нравятся мошеннические установки PHP 5.3.Не думайте, почему. Также этот код не использует никаких добавлений к функциям 5.3, просто этот синтаксис. Autoconversion кажется проще, чем делать это вручную или переопределять кодовую базу.)
Для переписывания скриптов * .php я в основном запускаю список токенов . Идентификатор поиска + слияние уже завершен. Но я немного запутался, как выполнить фактическое переписывание.
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()
может быть локальным , неквалифицированным , абсолютным или именным rewrite()
идентификаторами, без выражений). Список $identifiers2
имеет решающее значение для разрешения неквалифицированных идентификаторов, которые могут ссылаться на вещи в текущем пространстве имен или если они не найдены там, глобальные вещи.
И различные псевдонимы use namespace
должны быть приняты во внимание и добавить некоторые сложности, кроме правил разрешения имен и правил приоритета.
Итак, как / в каком порядке вы попытаетесь преобразовать вариации имен классов / функций здесь?
Умственная щедрость.
Чтобы сделать это менее вопиющим вопросом plzsendtehcodez: список объясняющих инструкций или ответ на псевдокод тоже будут иметь право. И если другой подход будет более подходящим для этой задачи, пожалуйста, уточните это. (Но нет, обновление PHP или изменение хостера не является вариантом.)
Я думаю, что я понял это тем временем, но вопрос по-прежнему открыт для ответов / предложений по внедрению. (В противном случае щедрость, очевидно, пойдет на никич.)
В существующем вопросе о переносе пространств имен на псевдо-именный код я уже представил инструмент преобразования, который я написал как часть более крупного проекта. С тех пор я не поддерживал этот проект, но, насколько я помню, замена пространства имен действительно сработала. (Я могу переопределить этот проект, используя подходящий парсер в какой-то момент. Работа с простыми токенами оказалась довольно утомительной задачей.)
Вы найдете мою реализацию пространства имен -> разрешение псевдопространства в namespace.php . Я основывал реализацию на правилах разрешения пространства имен , которые, вероятно, также помогут вам.
Чтобы сделать это менее вопиющим ответом readmycodez, вот основные шаги, которые выполняет код:
self
и parent
, а также true
, false
и null
константы. use
):
class
, проверьте, является ли идентификатор псевдонимом, а если он есть, замените его на класс с псевдонимом. class
preend текущего пространства имен, замените все разделители NS на символы подчеркивания и завершите этот алгоритм. assumeGlobal
установлен. Вместо этого я всегда вставляю динамический код отправки.) Примечание. Не забывайте, что можно также написать namespace\some\ns
. Я разрешаю эти конструкции в функции NS
(которая также отвечает за поиск деклараций пространства имен).