PHP有其神奇的方法__call
和__callStatic
,可以拦截对不存在的方法的调用。我正在寻找一种方法来拦截对不存在的函数的调用(位于命名空间内的函数,而不是类型)。
是否可以(PHP7)?
有一会儿我考虑将函数放在代理类中,但命名空间可以跨越多个文件,如果我没有弄错,PHP没有部分类,因此这种方法没用。
更新:每个命名空间的多个文件问题。
我们说我有文件A.php和B.php,两者都有相同的命名空间,比如Text
。考虑将所有函数放到代理类中。现在我有文件C.php,我打电话给Text\indexOf(...)
。但是,我不知道这是Text\proxyA::indexOf
还是Text\proxyB::indexOf
,因为我拥有的所有信息都是命名空间的名称 - Text
- 和函数名称。所以从来电方面来说,我是敬酒的。
答案 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
相同的方式使用它。