19

ここ数日悩んでいて結論が出たのですが、求めていた結論ではなかったので、諦める前に他の人の意見を聞いてみようと思います。信仰は最後に死ぬ...

スーパークラス (「スーパー」と呼ばれる) とサブクラス (「サブ」と呼ばれる) があるとします。

class Super {
    protected static $title = 'super';
    public static function get_class_name()        
    {
        echo __CLASS__;
    }
    public static function get_title()
    {
        echo self::$title;
    }
}
class Sub extends Super {
    protected static $title = 'sub';
}

Sub は Super を拡張するため、Sub は Super のすべてのメソッドを継承することになると思われますが、Sub のメソッドへの参照のみを受け取るようです。

私がこれを言うのは、私が電話した場合:

Sub::get_class_name();

出力は「サブ」ではなく「スーパー」です。

そして、私が電話した場合:

Sub::get_title();

繰り返しますが、出力は「スーパー」であり、$title を Sub で宣言しています。

つまり、継承された静的関数を呼び出すと、関数のスコープは呼び出されたものではなくスーパークラスになります (バックトレースを出力しても、呼び出しがスーパークラスで行われたことがわかります!!!)、呼び出しが行われているサブクラスとしてスコープを取得するには、そのサブクラス内でそのメソッドを再宣言する必要があります。これはクラスを拡張する目的に反しますね。

私の質問は、静的クラスを拡張し、継承されたメソッドの 1 つを呼び出して、サブクラスのスコープを持つことはできますか? または少なくともクラス名を識別できるようにするには?そうでない場合、なぜ静的クラスを拡張したいのでしょうか?

ありがとう!

4

3 に答える 3

32

繰り返しますが、これは PHP 5.3.0 より前では不可能です。

Late Static Bindingstaticは PHP 5.3.0 で導入され、キーワードを介して正確に実行できるようになりました

class Super {
    protected static $title = 'super';
    public static function get_class_name()        
    {
        echo __CLASS__;
    }
    public static function get_title()
    {
        echo static::$title;
    }
}
class Sub extends Super {
    protected static $title = 'sub';
}

get_class_name()実行中のメソッドが宣言されている現在のクラスSuperを常に返しますが、引き続き返されます(含まれているかどうかに関係なく、常に現在のファイルを返すようなものです)。__CLASS____FILE__

Subそのためには、クラスで関数を再宣言するしかありません。

class Super {
    protected static $title = 'super';
    public static function get_class_name()        
    {
        echo __CLASS__;
    }
    public static function get_title()
    {
        echo static::$title;
    }
}
class Sub extends Super {
    protected static $title = 'sub';

    public static function get_class_name()        
    {
        echo __CLASS__;
    }
}
于 2009-08-14T22:39:06.757 に答える
3

get_called_class()静的であっても、呼び出しているクラスのクラス名を取得するために使用できます。どこにも宣言する必要はありません。

アンドリューの例から:

class Super {
    public static function get_class1_name()        
    {
        echo __CLASS__;
    }
    public static function get_title()
    {
        echo get_called_class();
    }

}
class Sub extends Super {    
    public static function get_class2_name()        
    {
        echo __CLASS__;
    }

}
Sub::get_title(); // Echos Sub.
Sub::get_class1_Name(); // echos super
Sub::get_class2_Name(); // echos sub

したがって、変数を宣言する必要はありません。

于 2009-08-15T01:00:37.367 に答える