Is_callable and self



奇怪的是,以下两个表达式转储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,因为它不存在,因此不能作为函数调用。

相关内容

  • 没有找到相关文章

最新更新