我最近閱讀了PHP調用範圍和範圍解析運算符(:)。有兩種變體:實例調用和靜態調用。考慮如下因素listeng:__call,__call靜態和在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();
執行的A
__callStatic()
?實例調用應該在bar()方法的上下文中進行,不是嗎?它是PHP的功能嗎?
Addition1:
而且,如果我不使用魔法的方法和不明確調用,一切都按預期:
此<?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();'沒有拋出錯誤。 –
爲什麼?我認爲這是糾正在這種情況下。 – vasayxtx
[這不是](http://stackoverflow.com/questions/3754786/calling-non-static-method-with)。可能會拋出一個'E_STRICT'。 –