web-dev-qa-db-ja.com

PHPに静的プロパティをオーバーロードする機能がないのはなぜですか?

はじめに

PHPでは、クラスで マジックメソッド を宣言することにより、メソッド呼び出しと プロパティアクセス をオーバーロードできます。これにより、次のようなコードが有効になります。

class Foo {
    public function __get($name) { return 42; }
}

$foo = new Foo;
echo $foo->missingProperty; // prints "42"

PHP 5.3.0以降、インスタンスのプロパティとメソッドのオーバーロードは別として、マジックメソッド __callStatic をオーバーライドすることにより、staticメソッド呼び出しをオーバーロードすることもできます。

何かが足りない

利用可能な機能から目立って欠けているのは、静的プロパティをオーバーロードする機能です。次に例を示します。

echo Foo::$missingProperty; // fatal error: access to undeclared static property

この制限は明らかに 文書化

プロパティのオーバーロードはオブジェクトコンテキストでのみ機能します。これらの魔法のメソッドは静的なコンテキストではトリガーされません。したがって、これらのメソッドはstaticとして宣言しないでください。 PHP 5.3.0以降、マジックオーバーロードメソッドの1つがstaticとして宣言されている場合、警告が発行されます。

しかし、なぜ?

私の質問は:

  1. この機能が現在サポートされていないという技術的な理由はありますか?それともおそらく(震え)政治的な理由?
  2. 過去にこの機能を追加する試みが中止されたことはありますか?

最も重要なのは、質問がそうではない「ユーザーランドのPHPに動的静的プロパティを設定するにはどうすればよいか」ということです。とはいえ、共有したい__callStaticに基づく特にかわいい実装を知っている場合は、ぜひそうしてください。

13
Jon

引用 http://marc.info/?l=php-internals&m=121578194822276&w=2

静的メンバーのオーバーロードはPHP 5.3?)で追加されましたか?静的メソッドのオーバーロードが(__callStatic)であることに気付きました。これらは「静的クラス」RFCとバグレポートの一部ですが、5.3でこれらを確認できたら嬉しいです。この追加とLSBを使用すると、phpクラスは多くのことを実行できます!例:

__setStatic()
__getStatic()
__issetStatic()
__unsetStatic()

フォローアップの引用 http://marc.info/?l=php-internals&m=121578318524848&w=2

静的クラスのRFCが受け入れられる場合、静的プロパティインターセプターは次のPHPメジャーバージョン(5.4または6の可能性があります))の一部になります。したがって、5.3にはなりません。 、しかし私たちは将来うまくいけばそれを持つでしょう。

静的クラスRFCへのリンク:

RFCのステータスは「作業中」ですが、2008年以降の場合、php.internalsメーリングリストまたはEFNetの#php.peclで質問することをお勧めしますIRCそれから何が起こったのか。

11
Gordon