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(およびパブリックメソッド)で注意すべき点:

オブジェクトコンテキスト内のどこからでもパブリックメソッドを静的に呼び出すことができます(インスタンス化されたオブジェクト内の場合のみ)...静的に宣言されていない場合でも

Duck::quack();

同じシナリオで保護されたメソッドを呼び出すことはできません。

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

静的に宣言されていない限り、オブジェクトコンテキスト内のどこからでもパブリックプロパティ(インスタンス変数)を静的に呼び出すことはできません。

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

CANTは、静的に宣言されていない限り、OUTSIDEオブジェクトコンテキストから静的にパブリックメソッド(またはプロパティ)を呼び出します。

Duck::quack(); //error

他の言語はこのタイプのエンジンの柔軟性を使用しており、オブジェクトコンテキスト内からである限り、パブリックメソッドを静的に呼び出します。
(@poitroaeによって)述べたように、デフォルトではこのように機能しますが、オンにE_STRICTするとエラーが発生します。

また:このコンテキストでの
呼び出しを許可してはならないのは、PHPの既知の特異性です$thisプログラムはこの時点でクラスコンテキストの下にある必要があります(静的に呼び出されます)が$this、オブジェクトコンテキストと同様に機能します。
これが静的に宣言されたメソッドである場合、呼び出す$thisと即座に致命的なエラーが発生します。

お役に立てば幸い

于 2013-03-13T17:20:10.783 に答える