1

インスタンス化せずに、親クラスを介して子クラスのメンバー変数にアクセスしようとしています。

これは私の試みの 1 つですが、 でB::getStatic()失敗しAccess to undeclared static propertyます。

おそらく静的なしで、これに対する別の解決策はありますか?

class A {

    static public function getStatic() {

        return self::$myStatic;

    }

}

class B extends A {

    public static $myStatic = 5;

}

class C extends A {

    public static $myStatic = 6;

}

var_dump(B::$myStatic);
var_dump(B::getStatic());

var_dump(C::$myStatic);
var_dump(C::getStatic());
4

8 に答える 8

2

あなたが遭遇している概念は「レイトスタティックバインディング」と呼ばれています。PHP 5.3.0までは、これはサポートされていませんでした。

5.3.0以降を実行している場合は、getStatic()メソッドを更新します。

静的パブリック関数getStatic(){

return static::$myStatic;

}

于 2009-02-04T06:18:36.197 に答える
0

PHPマニュアルから:

現在のクラスへの静的参照は、関数が定義された場所と同様にself::__CLASS__関数が属するクラスを使用して解決されます。

したがって、メソッドは A で定義されているため、呼び出しgetStatic()たとき、BまたはC返そうとしたときa::$myStaticに、存在しません。存在したとしても、サブクラスでオーバーライドされた値ではなく、その値のみが返されます。

解決策は Late Static Bindings ですが、これはまだリリースされていない PHP 5.3 でのみ使用できます。

于 2009-02-04T00:22:59.487 に答える
0

関数と変数の宣言が一致していません。

関数の宣言を B に移動する必要があるか

また

変数の宣言を A に移動します。

于 2009-02-03T23:32:36.360 に答える
0

クラス B は、その逆ではなく、クラス A からプロパティを継承します。

B::$myStaticあなたの例で likeを使わないのはなぜですか?

于 2009-02-03T23:34:26.137 に答える
0

myStatic を A に移動する必要があります。A のメソッド getStatic は、A に存在しない変数にアクセスできません。

于 2009-02-03T23:38:42.353 に答える
-1

$myStaticクラス A で static と宣言する必要があります:ここを参照してください。

于 2009-02-03T23:32:23.707 に答える
-1
class A {
    public static $myStatic = 5;
}    
class B extends A {
    public static $myStatic = 3;
}
class C extends A {
    public static $myStatic = 1;
}

次に、 B::$myStatic を使用します ...

于 2009-02-03T23:34:47.057 に答える