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


13

イントロ

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

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

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

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

何かが足りない

利用可能な機能から目立って欠けているのは、静的プロパティをオーバーロードする機能です。たとえば:

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

この制限は明確に文書化されています

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

しかし、なぜ?

私の質問は:

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

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

回答:


11

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

静的メンバーのオーバーロードはPHP 5.3で追加されましたか?静的メソッドのオーバーロードが(__callStatic)であることに気付きました。この2つは互いに補完するものであり、これらを追加するのも自然なことです。それらは「静的クラス」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 IRCの#php.peclで質問してください。


ありがとう、ゴードン、いつものように、とても助かります。;-)静的クラスRFCはサポートを提案しているようだ一方__getStatic()__setStatic()静的なクラス、まだインスタンス化可能なクラスのためにこの機能があると便利だろう。この方向への動きを知っていますか?
デビッドワインラウブ

@DavidWeinraubいや、ごめんなさい。Tbh、静的メソッドに関連することは気にしません。私はそれらの良い使用法をほとんど見つけることができず、それらは悪いカップリングと苦痛なテストにつながります。
ゴードン

同意します!;-)しかし、私に突き刺さったいくつかのフレームワークは、モデル層に静的を使用します。__getStatic()既存のコードの多くを乾燥させることができます。ありがとう!
デビッドワインラウブ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.