为什么静态调用此方法有效?

时间:2013-03-13 17:10:40

标签: php oop class methods

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(); 

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

2 个答案:

答案 0 :(得分:2)

默认情况下有效,但如果您启用E_STRICT,则会获得

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

PHP看到你希望swim()实际上是静态的,所以你只需要调用它。

答案 1 :(得分:0)

PHP 5.3 (以及公共方法)需要注意的事项:

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

Duck::quack();

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

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

CANT 从INSIDE对象上下文中静态调用公共属性(实例变量),除非声明为static ...

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

CANT 从OUTSIDE对象上下文静态调用公共方法(或属性)..无声明静态

Duck::quack(); //error

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

同时
这是PHP的一个已知特性,你不应该被允许在这个上下文中调用$this。此时程序应该在Class Context下(静态调用),但是$this的工作类似于Object Context。
如果这是静态声明的方法,则调用$this会导致即时致命错误。

希望有所帮助