【问题标题】:Why does calling this method statically work?为什么静态调用此方法有效?
【发布时间】:2013-03-13 17:10:40
【问题描述】:
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(); 

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

【问题讨论】:

  • PHP5.3.10 ubuntu 说我不会游泳!人们正在淹死! 哈哈

标签: php oop class methods


【解决方案1】:

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

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

PHP 发现您希望 swim() 实际上是静态的,因此您只需调用它即可。

【讨论】:

    【解决方案2】:

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

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

    Duck::quack();
    

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

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

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

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

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

    Duck::quack(); //error
    

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

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

    希望有帮助

    【讨论】:

    • 这解释了很多,非常感谢,谢谢。我想要什么
    猜你喜欢
    • 2013-11-12
    • 2011-03-02
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 2011-12-11
    • 2016-11-16
    • 2023-03-06
    • 1970-01-01
    相关资源
    最近更新 更多