1

私は次の設定をしています:

<?php
class core {
    static $var1;
}

class parent extends core {
   function getStatic() {
       return parent::$var1;
   }
}

class child extends parent {
    function getStatic() {
        // I want to access core static var, how can i do it?
        //return parent::$var1;
   }
}
?>

私はparent::$var1を使用できるようにする必要がありますが、クラスの子の中から..これは可能ですか? 何か不足していますか?

4

3 に答える 3

4

それをselfとして参照するだけです... PHPは、一致するものが見つかるまで、継承のチェーンを自動的に上ります

class core {
    protected static $var1 = 'foo';
}
class foo extends core {
    public static function getStatic() {
        return self::$var1;
    }
}
class bar extends foo {
    public static function getStatic() {
        return self::$var1;
    }
}

ここで、bar で getStatic を宣言しないと問題が発生します。例を見てみましょう:

class foo1 extends core {
    protected static $var1 = 'bar';
    public static function getStatic() {
        return self::$var1;
    }
}
class bar1 extends foo1 {
    protected static $var1 = 'baz';
}

さて、あなたはfoo1::getStatic()戻ってくることを期待するでしょうbar(そしてそうなるでしょう)。しかし、何がBar1::getStatic()戻ってくるでしょうか?それも返っbarてきます。これは、遅延静的バインディングと呼ばれます。を返したい場合は、代わりに(PHP 5.3+ のみ)...bazを使用する必要があります。static::$var1self::$var1

于 2010-08-02T23:52:21.833 に答える
2

core::$var1 はあなたのニーズに最適なようです...

于 2010-08-02T21:51:27.540 に答える
1

ここでの最大の問題は、キーワードparentをクラス名として使用していることです。これにより、parent::$var1 への呼び出しがそのクラスを指すように意図されているか、呼び出し元のクラスの親を指すように意図されているかが完全に曖昧になります。

これをきれいにすれば、あなたが望むものを達成できると私は信じています。たとえば、このコードは「何か」を出力します。

class core {
    static $var1 = 'something';
}

class foo extends core {
   function getStatic() {
       return parent::$var1;
   }
}

class bar extends foo {
    function getStatic() {
        // I want to access core static var, how can i do it?
        return parent::$var1;
   }
}

$b = new bar ();
echo $b->getStatic ();

core::の代わりに使用しても機能しますparent::。ただし、クラス内でも静的な $var1 を宣言すると、これら 2 つの動作は異なります。fooそのまま、単一の継承された変数です。

于 2010-08-02T21:37:47.207 に答える