6
私はfound PHPインタープリタのいくつかの奇妙な(私のために)動作をしていて、本番環境で使用するかどうかは分かりません。スコープ解決演算子を使って非静的メソッドを呼び出す
我々はFoo::bar()
を呼び出し、Foo
クラスは静的bar
メソッドを持っていないが、それは非静的bar
メソッドを持っている場合、インタプリタは非静的bar
null
に(はい、それはとんでもない音)呼び出します。私はこの場合に__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
と等しい場合は他にもありますか?
ドキュメントをご利用いただきありがとうございます。この場合、 '__callStatic'を呼び出さなければならないと思います。クラスには、そのような名前のstaticメソッドはありません。 – Kolyunya
@Kolyunya静的(または非静的)変数内で変数 '$ this'を代入/再割り当てしようとしたときに興味深いことに気付いたのは、' __callStatic()は静的コンテキストではアクセスできないメソッドを呼び出すときにトリガされます。 )メソッドは、致命的なエラー 'Fatal error:/ Path/to/file.php'に$ thisを再代入することはできません。ですから、ベストプラクティスではありませんが、 'isset($ this)'が 'false'と同じような別のケースを想像することはできません。 –