PHP 5.3:子どものクラスで欠落している間に親クラスで定義されている場合、プロパティでは遅い静的結合が機能しません

StackOverflow https://stackoverflow.com/questions/4577187

質問

この例を見て、示されている出力に注意してください。

<?php

class Mommy
{
    protected static $_data = "Mommy Data";

    public static function init( $data )
    {
        static::$_data = $data;
    }

    public static function showData()
    {
        echo static::$_data . "<br>";
    }
}

class Brother extends Mommy
{
}

class Sister extends Mommy
{
}

Brother::init( "Brother Data" );
Sister::init( "Sister Data" );

Brother::showData(); // Outputs: Sister Data
Sister::showData(); // Outputs: Sister Data

?>

私の理解は、それを使用することでした 静的 キーワードは子供のクラスを参照しますが、明らかに、子のクラスに欠けているときはいつでも親クラスに魔法のように適用されます。 (これはPHPにとっては一種の危険な行動です。以下で説明したものについては詳細です。)

私はこれをやりたい理由について、次の2つのことを念頭に置いています。

  1. すべての子どものクラスですべてのプロパティを定義するという冗長性を望んでいません。
  2. プロパティを親クラスのデフォルトとして定義したいと考えています。また、子供クラスの定義が必要な場所にこれらのプロパティをオーバーライドできるようにしたいと考えています。チャイルドクラスは、デフォルトが意図されている場合はいつでもプロパティを除外する必要があります。そのため、上記の例では、子クラスのプロパティを定義しません。

ただし、実行時にプロパティをオーバーライドしたい場合(initメソッドを介して)、親クラスのためにオーバーライドします。その時点から、子供のクラスは(兄弟の場合のように)以前に初期化された(兄弟の場合のように)予想外にあなたを変えました。

どうやらこれは、子どものクラスの内部で明示的に定義されていないときはいつでも、子どものクラスが静的プロパティの独自のコピーを持っていない結果ですが、エラーをスローする代わりに、動作を切り替えるのではなく、 静的 親にアクセスします。したがって、 親クラスが、子クラスの定義の内側に表示されずに、子クラスに属するプロパティを動的に作成できる方法はありますか? そうすれば、子のクラスは静的プロパティの独自のコピーを持つことができ、静的キーワードはそれを適切に参照でき、親プロパティのデフォルトを考慮するために書き込むことができます。

それとも、良い、悪い、または醜い他の解決策がありますか?

役に立ちましたか?

解決

それは正しいクラスを参照します、それはまさに、それはまさに、それはまさに、参照セットが壊れていない場合、またはそうでなければ、サブクラスの静的プロパティがスーパークラスと同じ参照セットにあるということです。

だからあなたはしなければならない:

class Brother extends Mommy
{
    protected static $_data;
}

また:

class Brother extends Mommy
{
}

$tmp = null;
Brother::$_data =& $tmp;
unset($tmp);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top