从php类中删除名称的方法(不在运行时)

时间:2018-06-14 05:37:32

标签: php regex parsing

情况

  1. 我有一个包含2-3个类的文件。每个类可能包含也可能不包含析构函数__destruct()
  2. 我正在使用作曲家检索这些课程并且没有真正的控制权,我也无法选择性地说“继续”并忽略X~Z'析构函数调用所在的位置,因为这些行可能会略有变化。
  3. 我需要摆脱所有的析构函数 - 或者至少阻止它们在对象破坏上执行,因为我无法控制的代码的其他部分会跳转到无尽的析构循环中。
  4. 方法我尝试并考虑过:

    正则表达式

    我最初的想法是编写一个正则表达式,这将匹配所有这些函数并删除它们(尽力而为正则表达式,我确信会出现正则表达式无效的极端情况),但最终,在记住了关于正确使用正则表达式的各种问题后,我重新考虑了 - 没有提到事实,提出正则表达式似乎对我来说也是一个问题。

    用于C

    中嵌套作用域的卷括号块

    我在C中有一些背景,所以有一秒我认为我可以将所有行与function __destruct()匹配,验证同一行上没有{并将定义注释掉,所以我会得到这样的东西:

    # function __destruct()
    {
    echo "initiating destructor function";
    $this->callToSomething();
    }
    

    我认为不会执行(或者至少 - 不会执行对象销毁,这就是为什么我需要对此进行评论)。但PHP不允许这种语法,我不能这样做。也许它允许一些其他语法可以达到相同的结果?

    解析,反思? ...?

    我真的不想自己为这个任务编写自己的PHP解析器,但是如果这是它将要采取的,我会这样做。但是由于PHP中已经有一个Reflection类,也许会有一种方法将类加载到内存中,在运行时删除析构函数然后覆盖磁盘上的类定义?

1 个答案:

答案 0 :(得分:0)

我不明白为什么你不能在这里使用正则表达式。当然,你需要一个更先进的模式。 但是你永远不应该被迫接触它。

这是一个找到__destruct()块的模式:

function\s+__destruct\s*\(\s*\)\s*({(?>[^{}\\]++|\\.|(?1))*+})

Demo

您需要做的就是加载有问题的文件,运行

$re = '/function\s+__destruct\s*\(\s*\)\s*({(?>[^{}\\\\]++|\\\\.|(?1))*+})/s';
$result = preg_replace($re, '', $str);

将文件保存回磁盘。 C'estça。