【发布时间】:2023-04-08 21:06:01
【问题描述】:
我正在尝试从 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)
rewrite() 函数接收到的 $name 参数可以是 local、unqualified、\absolute 或 name\spaced 标识符(但只是标识符,没有表达式)。 $identifiers2 列表对于解析 unqualified 标识符至关重要,这些标识符可以引用当前命名空间中的内容,或者如果在其中找不到,则为全局内容。
除了命名空间解析和优先规则之外,还必须考虑各种use namespace 别名并添加一些复杂性。
那么,您将如何/以何种顺序尝试在这里转换类/函数名称的变体?
精神懒惰赏金。
为了使这成为一个不那么明显的 plzsendtehcodez 问题:解释性指令列表或伪代码答案也符合条件。如果另一种方法更适合该任务,请详细说明。 (但不,升级 PHP 或更改主机不是一个选项。)
我想我已经想通了,但问题仍然有待回答/实施建议。 (否则赏金显然会归 nikic。)
【问题讨论】:
-
这个转换器可能对很多人(包括我)非常有用。我很想看看结果!
-
哦,this 包含一些关于命名空间解析的信息。
-
我相信这个转换会导致很多错误。而且我认为最好改变托管,而不是用代码进行这种冒险的操作。也许是为了一些库分发,但即使在这种情况下,如果这个库成为安装 PHP 5.3 的理由会更好。
-
@OZ_:如果所有内容的前缀一致(这是该工具应该做的),则不会发生冲突,因此可能存在一些特殊情况,例如动态函数/方法调用,但可以避免这些情况.您并不总是可以选择托管商。有些客户可能想在自己的机器上使用它,等等。在这些情况下拥有这样的工具真是太好了。
-
让它在 php 5.2 上运行是问题的主题和约束。
标签: php namespaces tokenize