我正在尝试创建一个方法,可以修改文件中的类并将类转储到同一个文件中。
这样做的最佳做法是什么?
我要做的是:
说我有班级:
test.php的:
namespace test;
class Test{
}
...我想处理这个类,所以最终输出将是
test.php的:
namespace test;
class Test implements /interfaces/Entity{
}
使用* str_replace *,它将类似于:
function parseImplementation($src, $class, $interface){
return str_replace("$class", " $class implements $interface", $src);
}
我已经尝试了Reflection API,但我真的找不到编辑类本身并将其转储到源代码的方法。
有没有顺利的方法呢? str_replace不是一个选项,因为Test类可以实现其他东西,并使用制表符/空格作为分隔符键入。
答案 0 :(得分:1)
你想要的是source-to-source program transformation system。这是一个将代码解析为独立于布局等的编译器数据结构(抽象语法树)的工具,然后让你编写“如果你看到然后用那些在编译器数据结构上运行的操作替换它”。 (是的,您可以尝试使用字符串黑客进行此操作,它可能适用于您手头的示例,但字符串黑客通常不可靠,因为您不能仅使用字符串黑客来解析真实源代码)。
要做到这一点,您需要能够可靠地解析PHP并将源应用于源转换的东西。这样做的工具并不多。
我们的DMS Software Reengineering Toolkit及其PHP Front End就可以了。
您可以使用DMS进行特定的转换:
domain PHP~PHP5; -- declare the programming language DMS will process
rule add_interface_to_class(class_name:identifier,
m: class_members):
class_declaration -> class_declaration =
"class \i { \m } "
-> "class \i implements /interfaces/\entity\(\){ \m } ";
rule add_another_interface_to_class(class_name:identifier,
ifaces:interfaces,
m: class_members):
class_declaration -> class_declaration =
"class \i implements \ifaces { \m } "
-> "class \i implements \ifaces,/interfaces/\entity\(\){ \m } ";
我这里有两个规则,一个用来处理你的类有implements子句的情况, 以及一个处理implements子句已经存在的情况。
目前尚不清楚“命名空间测试”如何在您的示例中播放,但如果这很重要,您必须为每个规则添加一个条件测试,以验证我在“正确”命名空间中的标识符。 / p>