修改类并转储它的好方法? - 反思?

时间:2011-09-07 14:41:46

标签: php reflection php-5.3

我正在尝试创建一个方法,可以修改文件中的类并将类转储到同一个文件中。

这样做的最佳做法是什么?

我要做的是:

说我有班级:

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类可以实现其他东西,并使用制表符/空格作为分隔符键入。

1 个答案:

答案 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>