奇怪的是,以下两个表达式转储bool(true):
class B {
public function __construct() {
var_dump(is_callable(array($this, "z")), is_callable(array("self", "z")));
}
}
class C extends B {
public function z() {}
}
new C();
我只期望第一个是真的。如果我从B
内部调用self::z()
,则显示错误。
是否有另一种简单的方法来找出类B是否包含一个可调用的方法z
(而不是使用ReflectionMethod类-更像是最后的手段)?
更新:我发现is_callable(array(__CLASS__, "z"))
显示正确的结果。再一次,奇怪的是
这段代码执行得很好,很正确:-
<?php
class B {
public function __construct() {
var_dump(is_callable(array($this, "z")),
is_callable(array("self", "z")));
}
}
class C extends B {
public function z() {}
}
new C();
?>
输出:bool(true) bool(true)。让我来解释一下为什么;is_callable(array($this, "z")
$this refers to the current class
using constructor and即class B;和输出正确。对于第二个可调用的方法,调用子类中的函数,然后是使用self作为可调用对象的参数。
由于子类继承了父类的所有属性和特征,因此它不能继承父类继承self作用域调用,并到达可调用的作用域子类。在回调函数中使用self与父类对话你也在和它的子类对话。回调函数考虑子对象类中可用的所有属性和特征子类。
is_callable(array("self", "z"))) Her you are checking if z is callable
,它可以在类C下调用,因为它是b的子类
这是你的代码稍作修改。
<?php
class B {
public function __construct() {
var_dump(is_callable(array($this, "z")),
is_callable(array("self", "z")),
is_callable(array("self", "d")));
}
}
class C extends B {
public function z() {}
}
new C();
?>
输出:- bool(true) bool(true) bool(false)最后一个计算结果为false,因为它不存在,因此不能作为函数调用。