2016-04-03 22 views
6

私はfound PHPインタープリタのいくつかの奇妙な(私のために)動作をしていて、本番環境で使用するかどうかは分かりません。スコープ解決演算子を使って非静的メソッドを呼び出す

我々はFoo::bar()を呼び出し、Fooクラスは静的barメソッドを持っていないが、それは非静的barメソッドを持っている場合、インタプリタは非静的barnullに(はい、それはとんでもない音)呼び出します。私はこの場合に__callStaticが呼び出されると予想しました。しかし何らかの理由で何が起こっているのではない。

class Foo 
{ 
    public function bar(){ 
     if (isset($this)) { 
      $this->nonStaticBar(); 
     } else { 
      static::staticBar(); 
     } 
    } 

    private function nonStaticBar() { 
     echo "Non-static\n"; 
    } 

    private static function staticBar() { 
     echo "Static\n"; 
    } 
} 

(new Foo())->bar(); // Output: "Non-static" 
Foo::bar(); // Output: "Static" 

はい、私は、このアプローチではないことを、知っている:このように同じ名前を持つ静的および非静的メソッドを持つクラスを提供する:

は、私は、この動作のための便利な使い方を見つけましたエレガントで構造的に間違っています。問題は、この「機能」を使用するのが安全(標準準拠)であるかどうかです。 isset($this)falseと等しい場合は他にもありますか?

答えて

3

上記の例は機能しますが、それはベストプラクティスではありません。 は、これは、PHPのドキュメントhereに認識され、E_STRICTエラー報告が有効になっている場合は、バージョン7の前にPHPのバージョンでは、それはエラーを発するだろうと述べている:7 PHPのバージョンでは静的静的関数を呼び出す上記に加え

Strict Standards: Non-static method Foo::bar() should not be called statically in /Path/to/file.php on line 22 

実行時に次のエラーが発生します。

Deprecated: Non-static method Foo::bar() should not be called statically in /Path/to/file.php on line 22 
+0

ドキュメントをご利用いただきありがとうございます。この場合、 '__callStatic'を呼び出さなければならないと思います。クラスには、そのような名前のstaticメソッドはありません。 – Kolyunya

+0

@Kolyunya静的(または非静的)変数内で変数 '$ this'を代入/再割り当てしようとしたときに興味深いことに気付いたのは、' __callStatic()は静的コンテキストではアクセスできないメソッドを呼び出すときにトリガされます。 )メソッドは、致命的なエラー 'Fatal error:/ Path/to/file.php'に$ thisを再代入することはできません。ですから、ベストプラクティスではありませんが、 'isset($ this)'が 'false'と同じような別のケースを想像することはできません。 –

関連する問題