Is_callable和self

时间:2014-07-11 20:04:44

标签: php class callable

奇怪的是,以下两个表达式转储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"))再次显示正确的结果,奇怪的是。

1 个答案:

答案 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,因为它不存在,因此不能将其作为函数调用。