首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Is_callable与自我

Is_callable与自我
EN

Stack Overflow用户
提问于 2014-07-11 20:04:43
回答 1查看 1.8K关注 0票数 1

奇怪的是,以下两个表达式都转储bool(true):

代码语言:javascript
复制
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"))显示了正确的结果。再一次,奇怪的是。

EN

回答 1

Stack Overflow用户

发布于 2014-07-11 20:36:33

这段代码执行的很好,而且应该正确:

代码语言:javascript
复制
<?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与父类交谈时,您也在与其子类交谈。回调函数将子类视为父类,因为所有属性和特征都在子类中可用。

代码语言:javascript
复制
is_callable(array("self", "z")))  Her you are checking if z is callable

它在C类下是可调用的,因为它是B的子类。

这是您的代码,只需稍作修改。

代码语言:javascript
复制
<?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,因为它不存在,因此不能作为函数调用。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24705665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档