2
class Duck {
  public function quack() {
    $this­->swim();
  }
  public function swim() {
    echo 'I\'m swimming!';
  }
}
class Plane {
  public function fly() {
    Duck::quack(); 
  }
  public function swim()
  {
  echo 'I can\'t swim! People are DROWNING!';
  } 
}
$plane = new Plane(); 
$plane-­>fly(); 

我被问到上述问题并给出了输出是非法调用静态方法的错误的答案。
但它实际上打印“我在游泳!”。
有人可以解释为什么会这样吗?

4

2 回答 2

2

它默认工作,但如果你打开E_STRICT你会得到

PHP Strict Standards: Non-static method Duck::quack() should not be called statically in...

PHP 看到你想要swim()真正的静态,所以它让你简单地调用它。

于 2013-03-13T17:12:12.420 回答
0

PHP 5.3(和公共方法)的注意事项:

可以从INSIDE对象上下文中的任何位置静态调用公共方法(仅当在实例化对象内部时)...即使未声明为静态的

Duck::quack();

不能在同一场景中调用受保护的方法。

Duck::quack(); //error
protected function quack() { }

不能从对象上下文中的任何地方静态调用公共属性(实例变量),除非声明为静态...

class Duck {
 public $hello = 'hello there';   
}
class Plane {
 Duck::$hello; //error
}

不能从外部对象上下文静态调用公共方法(或属性)。除非声明为静态

Duck::quack(); //error

其他语言使用这种类型的引擎灵活性,只要从对象上下文中静态调用任何公共方法。
如前所述(@poitroae)默认情况下它是这样工作的,但如果你打开E_STRICT你会得到一个错误。

另外:
PHP 的一个已知特性是您不应该被允许$this在此上下文中调用。此时程序应该在类上下文下(被静态调用),但$this它的工作方式类似于对象上下文。
如果这是一个静态声明的方法,那么调用$this将导致即时致命错误。

希望有帮助

于 2013-03-13T17:20:10.783 回答