PHP 7 CLI:有没有任何方法可以跳过未定义的函数?

时间:2016-12-16 03:04:09

标签: php error-handling tokenize php-7

场景我有一个非常大的php文件,它有多个不同函数的调用。 此文件通常在“复杂”内执行。 MVC,因此所有对象,方法,函数都在其他地方定义得更高。

我正在编写一个粗略的PHP脚本,要从PHP CLI执行,它将直接包含这个其他文件。

我不关心文件中的任何内容,除了调用一个特定的函数

example($string); 

我想在我的新脚本中定义example()来做一些基本的事情,在这种情况下记录到一个文件。例如

example($string){
    file_put_contents('file.txt', $string, FILE_APPEND);
}

我不能简单地找到example()的原始定义,在那里添加我的新代码,并正常执行整个应用程序,因为example()被调用到处,我真的只想针对这一个特定的文件。

问题 有没有办法强制PHP继续执行未定义的函数?我不想在try catch中包装其他所有函数的实例,(原始文件根本不应该被修改)。我已经尝试了set_exception_handler以及在.ini中修改异常处理的其他方法,虽然我可以自定义它,但在抛出自定义异常时PHP仍会停止执行脚本。

目前我在CLI脚本中创建虚拟函数

 function already_defined_function(){
      return null; 
   }

因为这只会产生警告。当我尝试定位大量文件时,这很乏味并且很快就会中断。

我很好奇是否有一种抽象方法可以抑制任何和所有未定义的方法/函数/类实例化。我现在相信这是不可能的。

我已经尝试将PHP文件加载为文本/字符串,然后使用tokenizer来获取这样的内容:

[1094] => Array
    (
        [0] => 319
        [1] => example
        [2] => 172
    )

[1095] => (
[1096] => Array
    (
        [0] => 323
        [1] => 'example string parameter example'
        [2] => 172
    )

[1097] => )
[1098] => ;

然后我可以遍历这个数组并重新组合函数调用。但是,我不清楚是否有其他参数,破坏空格等会改变构成一个完整的数组的数组项目的数量。功能调用。

1 个答案:

答案 0 :(得分:0)

PHP7现在允许您捕获大多数错误。这应该有效:

try {
    undefinedfunc('Hello World');
}
catch (Error $e) {
    echo "Error caught\n";
}
echo "Reached\n";

我只是说你不想把你的调用包裹在try catch块中,但我相信这是处理这类事情的正确方法。

我认为一个很好的选择就是编写自己的调用者,如下所示:

function call_and_catch_function($name, $arguments) {
   try {
       return call_user_func_array($name, $arguments);
   }
   catch (Error $e) {
       // Do something
   }
}