【发布时间】:2013-08-28 12:26:11
【问题描述】:
我最近阅读了有关在 PHP 中调用作用域和作用域解析运算符 (::) 的内容。有两种变体:实例调用和静态调用。考虑以下监听:
<?php
class A {
public function __call($method, $parameters) {
echo "I'm the __call() magic method".PHP_EOL;
}
public static function __callStatic($method, $parameters) {
echo "I'm the __callStatic() magic method".PHP_EOL;
}
}
class B extends A {
public function bar() {
A::foo();
}
}
class C {
public function bar() {
A::foo();
}
}
A::foo();
(new A)->foo();
B::bar();
(new B)->bar();
C::bar();
(new C)->bar();
执行结果(PHP 5.4.9-4ubuntu2.2)为:
I'm the __callStatic() magic method
I'm the __call() magic method
I'm the __callStatic() magic method
I'm the __call() magic method
I'm the __callStatic() magic method
I'm the __callStatic() magic method
我不明白为什么(new C)->bar(); 执行__callStatic() 的A?实例调用应该在 bar() 方法的上下文中进行,不是吗?是PHP的特性吗?
加法1:
此外,如果我不使用魔法方法并进行显式调用,一切都会按预期进行:
<?php
class A {
public function foo() {
echo "I'm the foo() method of A class".PHP_EOL;
echo 'Current class of $this is '.get_class($this).PHP_EOL;
echo 'Called class is '.get_called_class().PHP_EOL;
}
}
class B {
public function bar() {
A::foo();
}
}
(new B)->bar();
结果:
I'm the foo() method of A class
Current class of $this is B
Called class is B
【问题讨论】:
-
我更感兴趣的是为什么
C::bar();没有抛出错误。 -
为什么?我认为在这种情况下它可以纠正。
-
It's not。并且可能会抛出
E_STRICT。 -
嗯,来自我的 php.ini:
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT. -
@JasonMcCreary 是的,你是对的。我必须在开发中的error_reporting中使用E_STRICT常量,我忘记了:)
标签: php