奇怪的是,以下两个表达式都转储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"))显示了正确的结果。再一次,奇怪的是。
发布于 2014-07-11 20:36:33
这段代码执行的很好,而且应该正确:
<?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(真)bool(真)让我解释一下为什么;使用构造函数的is_callable(array($this, "z") $thisrefers to the current 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,因为它不存在,因此不能作为函数调用。
https://stackoverflow.com/questions/24705665
复制相似问题