PHP 命名空间删除/映射和重写标识符
我正在尝试从PHP类集合中自动删除命名空间,以使它们与PHP 5.2兼容。(共享主机提供商不喜欢流氓PHP 5.3安装。不知道为什么。此外,有问题的代码不使用任何5.3功能添加,只是使用该语法。自动转换似乎比手动执行或重新实现代码库更容易。
为了重写*.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
}
该函数将在每个找到的标识符(无论是类,函数还是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\spaced 标识符(但只是标识器,没有表达式)。该列表对于解析非限定标识符至关重要,这些标识符可以引用当前命名空间中的事物,或者如果找不到,则引用全局内容。$name
rewrite()
$identifiers2
并且必须考虑各种别名,并且除了命名空间解析和优先级规则之外,还会增加一些复杂性。use namespace
那么,您将如何/以何种顺序尝试在此处转换类/函数名称的变体?
精神懒惰赏金。
为了使这成为一个不那么明目张胆的plzsendtehcodez问题:解释性指令列表或伪代码答案也符合条件。如果另一种方法更适合这项任务,请详细说明这一点。(但是不,升级PHP或更改主机不是一种选择。
我想我同时已经想通了,但这个问题仍然有待回答/实施建议。(否则赏金显然会流向nikic。