奇怪的是,以下两个表达式转储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();
我只想到第一个是真的。
如果我从self::z()
内部拨打B
,则会显示错误。
是否有另一种简单的方法可以找出B类是否包含可调用方法z
(除了使用ReflectionMethod类 - 更像是最后的手段)?
更新:我发现is_callable(array(__CLASS__, "z"))
再次显示正确的结果,奇怪的是。
答案 0 :(得分:-1)
此代码执行正常且应该正确: -
<?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
使用构造函数,即B类;和
输出是正确的。
对于第二个可调用方法,调用子类中的函数
使用 self 将callable作为参数。
由于子类继承了Parent类的所有属性和特性,因此 继承 self 范围调用,并达到可调用的范围 孩子班。在回调函数中使用 self 与父类交谈时 你也在和它的儿童班谈话。回调函数会考虑孩子 class作为父类,因为所有属性和特性都可用 孩子班。
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,因为它不存在,因此不能将其作为函数调用。