【问题标题】:PHP 7 CLI: is there any method to skip undefined functions?PHP 7 CLI:有什么方法可以跳过未定义的函数吗?
【发布时间】:2016-12-16 03:04:09
【问题描述】:

场景 我有一个非常大的 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 文件加载为文本/字符串,然后使用标记器来获得类似这样的内容:

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

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

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

然后我可以遍历这个数组并重新组装函数调用。但我不清楚附加参数、分隔空格等是否会改变组成一个“完整”函数调用的数组项的数量。

【问题讨论】:

  • 为什么不只是include包含函数定义的文件?
  • 因为我在脚本中重新定义了那个函数定义。定义其他“不需要”功能的其他文件跨越数百个文件。
  • 那么,让我看看我是否有这个权利。您想使用自己的example() 定义,而不是现有定义。好的。但是,如果您不包括定义该文件的文件,那有什么问题?您只需像处理任何其他函数一样执行function example(...) {...},就不会出现错误。我在这里错过了什么?
  • 问题不在于 example() 本身,而在于所有其他不是 example() 的函数,以及当我包含文件时 PHP 试图执行的函数,因此引发了致命错误.
  • 是的,我想这是看待它的一种方式。我在想更多,'如果未定义函数,请继续执行脚本而不是抛出致命错误'。但是一些在运行时动态定义不是 example() 的其他函数的方法应该也可以工作......(这可能吗!?)

标签: php error-handling tokenize php-7


【解决方案1】:

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
   }
}

【讨论】:

  • 感谢您的回答,devon,我同意如果我正在修改原始应用程序/文件,这将是处理此问题的正确方法。为了这个场景,让我们假设我不能,或者那是不切实际的。
  • 我添加了一些额外的内容,这里留给其他读者。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-27
  • 2023-03-15
  • 2020-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多