模拟非对象的__call()


Simulate __call() for non objects

下面的例子肯定会输出一个错误:

$myVar = "hello";
$var->exeptionForSure();
==> Fatal error: Call to a member function exeptionForSure() on a non-object in..

有没有一种方法可以模拟/实现神奇的方法__call()在这种情况下也能工作?

如果出于某种原因,我试图访问非对象中的方法,我希望能够调用自己的函数。

PHP中没有这种功能,而且可能永远不会有.

任何这样的方法都必须在PHP脚本期间全局存在(没有类上下文可供其运行),并且对于这样一个不寻常的需求,它的存在可能会使代码复杂化。

这也意味着一些稍微奇怪的作用域规则:假设$non_object->method(42);被翻译为magic_non_object_call($non_object, 'method', array(42));,则左侧操作数($non_object)必须通过值(在这种情况下无法写回)或引用(这需要PHP放弃对该变量的"写时复制"内存优化)传入。请注意,对象是用一个额外的抽象层来表示的,因此$this(以及"按值"传递或复制的对象)实际上包含"真实"对象的句柄,从而避免了这个确切的问题。

从根本上说,你需要这样做的唯一原因是作为一个"最后一搏"错误处理程序——如果你的代码让你无法判断给定的变量是否是对象,那就是一个错误。不幸的是,这是一个致命错误,所以我认为你无法捕捉/处理它

这应该有效:

method_exists($var, 'exeptionForSure') ? $var->exeptionForSure() : fallback();

您还可以为您的对象定义与上面相同的特定方法,因此您可以执行以下操作:

$obj->call_func('func_name', $params);

只有对象具有可以调用的方法。在PHP中,字符串、数字等不是对象,因此不能在它们上定义或调用方法。

method_exists检查给定对象是否存在某个方法。但是您不应该为非对象调用此函数。

首先你应该检查$var是否是一个对象:

if (is_object($var) && method_exists($var, 'exeptionForSure')) {
   $var->exeptionForSure();
} else {
   fallback(); 
}