0

以下示例肯定会输出错误:

$myVar = "hello";
$var->exeptionForSure();

==> Fatal error: Call to a member function exeptionForSure() on a non-object in..

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

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

4

3 回答 3

1

PHP 中没有这方面的功能,而且可能永远不会有。

任何这样的方法都必须在 PHP 脚本的持续时间内全局存在(没有在其中运行的类上下文),并且对于这种不寻常的要求,它的存在可能会使代码复杂化很多。

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

从根本上说,您需要这样做的唯一原因是作为“最后一道防线”错误处理程序 - 如果您的代码无法判断给定变量是否为对象,那就是一个错误。不幸的是,这是一个致命错误,所以我认为您无法捕获/处理它。(请注意,它不是异常;很少有 PHP 内置程序会抛出异常。)

于 2013-08-30T18:35:21.970 回答
0

这应该有效:

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

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

$obj->call_func('func_name', $params);
于 2013-08-30T18:16:57.967 回答
0

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

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

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

if (is_object($var) && method_exists($var, 'exeptionForSure')) {
   $var->exeptionForSure();
} else {
   fallback(); 
}
于 2013-08-30T18:30:43.417 回答