是否可以拦截对不存在的函数的调用?

时间:2016-02-23 20:27:03

标签: php

PHP有其神奇的方法__call__callStatic,可以拦截对不存在的方法的调用。我正在寻找一种方法来拦截对不存在的函数的调用(位于命名空间内的函数,而不是类型)。

是否可以(PHP7)?

有一会儿我考虑将函数放在代理类中,但命名空间可以跨越多个文件,如果我没有弄错,PHP没有部分类,因此这种方法没用。

更新:每个命名空间的多个文件问题。

我们说我有文件A.php和B.php,两者都有相同的命名空间,比如Text。考虑将所有函数放到代理类中。现在我有文件C.php,我打电话给Text\indexOf(...)。但是,我不知道这是Text\proxyA::indexOf还是Text\proxyB::indexOf,因为我拥有的所有信息都是命名空间的名称 - Text - 和函数名称。所以从来电方面来说,我是敬酒的。

2 个答案:

答案 0 :(得分:3)

使用PHP7 +,您可以捕获对未定义函数的调用:

try {
    not_exist();
} catch (\Error $e) {
    echo 'ERROR: ' . $e->getMessage();
}

然后,您可以使用set_exception_handler来抓住try / catch块:

set_exception_handler(function($e) {
    echo '<BR>ERROR: ' . $e->getMessage();
});

not_exist();

请注意,您需要使用set_exception_handler而不是set_error_handler

答案 1 :(得分:2)

从PHP7开始,您可以捕获未定义的函数调用:

try {
    idontexist();
} catch (\Error $e) {
    echo $e->getMessage();
}

除了通过自定义错误处理程序之外,没有办法以与__call相同的方式使用它。

演示:https://3v4l.org/j4WRB