Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 你是可呼的,是自我的吗_Php_Class_Callable - Fatal编程技术网

Php 你是可呼的,是自我的吗

Php 你是可呼的,是自我的吗,php,class,callable,Php,Class,Callable,奇怪的是,以下两个表达式都是booltrue: 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,

奇怪的是,以下两个表达式都是booltrue:

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,将显示一个错误

除了使用ReflectionMethod类(更像是最后的手段)之外,还有没有其他简单的方法来确定类B是否包含可调用的方法z


更新:我发现是callablearray uuuuu类uuz,显示正确的结果。。同样奇怪的是。

这段代码执行得很好并且正确,正如它应该的那样:-

<?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();
?>
它在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();
    ?>
输出:-booltrue booltrue boolfalse
最后一个计算结果为false,因为它不存在,因此不能作为函数调用。

只需使用类,问题是什么。你为什么要使用self?@trueself应该引用自己的类。is_callable将self解释为$this。我的结论是,is_callable有一个问题。uuu CLASS_uuu不起作用,因为它将引用CLASS B,而不是C@true这正是我们想要的即使self成功了,它仍然会引用类B,而不是C。构造函数被放置在B中,而不是C。self引用B,这就是self::z导致错误的原因。is_callable在这里不仅在理论上是错误的,实际上也是错误的,因为它所说的可调用性被证明是错误的!这继承了父类的回调函数;从父作用域继承我不是说$this,而是说self。
<?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();
    ?>