15

私は今書いているアプリケーションでこの男と同じ問題を抱えています。問題は、静的プロパティがサブクラスに継承されないことです。そのため、メイン クラスで static:: キーワードを使用すると、メイン クラスでも変数が設定されます。

サブクラスで静的変数を再宣言すると機能しますが、多数の静的プロパティとサブクラスがあると予想され、コードの重複を避けたいと考えています。私がリンクしたページの最高評価の応答には、いくつかの「回避策」へのリンクがありますが、404 になっているようです。誰かが私に助けを貸してくれるか、おそらく上記の回避策の方向に私を向けることができますか?

4

3 に答える 3

9

それがどのような具体的な回避策について話していたのかはわかりませんが、機能する可能性のあるかなりの数の回避策を考えることができます. 私は個人的にこれらをどのコードでも使用しません。PHP で遅延静的バインディングを過剰に使用することは可能ですか? をご覧になることをお勧めします。そして、達成したいことを行うためのより良い方法があるかどうかを再考してください。

また、ここに書いたので、私のコードは完全にテストされていないことに注意してください。

方法 1: 常に配列を使用して計算する

他のすべてのメソッドは、このメソッドに基づいています。static プロパティを使用する場合は常に、クラスを検出して取得するコードを挿入します。他の場所でプロパティを使用する予定がない場合にのみ、これを検討します。

$class = get_called_class();
if(isset(self::$_names[$class])) {
    return self::$_names[$class];
}
else {
    return static::NAME_DEFAULT;
}

方法 2: getter/setting メソッドを使用する

複数の場所で使用する予定がある場合は、この方法が適しています。一部のシングルトン パターンでは、同様の方法が使用されます。

<?php
class SomeParent {
    const NAME_DEFAULT = 'Whatever defaults here';

    private static $_names = array();

    static function getName($property) {
        $class = get_called_class();
        if(isset(self::$_names[$class])) {
            $name self::$_names[$class];
        }
        else {
            $name = "Kandy"; // use some sort of default value
        }
    }

    static function setName($value) {
        $class = get_called_class();
        self::$_names[$class] = $value;
    }
}

方法 3: __callStatic

これは断然最も便利な方法です。ただし、それを使用するにはオブジェクト インスタンスが必要です (__get および __set は静的に使用できません)。また、このメソッドは最も低速です (他の 2 つよりもはるかに低速です)。あなたはすでに静的プロパティを使用しているので、これはすでにオプションではないと推測しています。(この方法がうまくいく場合は、静的プロパティを使用しない方がよいでしょう)

<?php
class SomeParent {

    const NAME_DEFAULT = 'Whatever defaults here';

    private static $_names = array();

    function __get($property) {
        if($property == 'name') {
            $class = get_called_class();
            if(isset(self::$_names[$class])) {
                return self::$_names[$class];
            }
            else {
                return static::NAME_DEFAULT;
            }
        }
        // should probably trigger some sort of error here
    }

    function __set($property, $value) {
        if($property == 'name') {
            $class = get_called_class();
            self::$_names[$class] = $value;
        }
        else {
            static::$property = $value;
        }
    }
}
于 2010-05-02T16:02:05.387 に答える