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

可以做(PHP7)吗?

有一段时间我考虑把函数放在代理类中,但是命名空间可以跨越多个文件,如果我没记错的话,PHP没有部分类,因此这种方法没有用。

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

假设我有文件 A.php 和 B.php,它们都具有相同的命名空间,比如 Text 。考虑将所有函数都放到代理类中。现在我有文件 C.php 并且我有电话 Text\indexOf(...) 。但是我不知道这是 Text\proxyA::indexOf 还是 Text\proxyB::indexOf,因为我拥有的所有信息都是命名空间的名称——Text——和函数名称。因此,从来电者方面来说,我很高兴。

最佳答案

使用 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

关于php - 是否可以拦截对不存在的函数的调用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35587468/

10-16 11:53
查看更多