Php 你是可呼的,是自我的吗
奇怪的是,以下两个表达式都是booltrue: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,
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();
?>