2010-11-25 25 views
10

私は最近、いくつかのクラスファイルを処理していました。メンバー変数がprotected static $ _someVarのようなprotected staticモードで設定され、static :: $ _ someVarのようにアクセスされていました。保護された静的メンバー変数

私は可視性の概念を理解していて、何かをprotected staticとして設定すると、スーパークラスまたは派生クラスでのみアクセス可能ですが、静的メソッドでのみ保護された静的変数にアクセスできますか?

ありがとう

答えて

33

私が正しく理解していれば、あなたが指しているものはlate-static bindingsと呼ばれています。あなたがこれを持っている場合:

class A { 
    static protected $_foo = 'bar'; 

    static public function test() { 
     echo self::$_foo; 
    } 
} 

class B extends A { 
    static protected $_foo = 'baz'; 
} 

B::test(); // outputs 'bar' 

あなたが変更した場合はselfビットへ:

echo static::$_foo; 
その後

行います

B::test(); // outputs 'baz' 

self$_fooが定義されたクラス(A)を参照するのでstaticは実行時に呼び出されたクラスを参照します(B)。

もちろん、可視性と有効範囲は依然として重要ですが、静的メソッド(オブジェクトコンテキスト)以外の静的保護メンバーにアクセスすることはできます。

+2

私は、この例では、クラスBは "クラスBが拡張A"でなければならないと思います。 –

+0

@Nathan:良い呼び出し(数週間後でも)。一定。ありがとう! – netcoder

6

スタティック変数は、クラスのインスタンスではなくクラスに存在します。この作品の理由がselfではなく($thisのような)現在のインスタンスに比べて、現在のクラスへの参照であるということである

self::$_someVar 

:あなたは彼らに何かを呼び出す、非静的メソッドからそれらにアクセスすることができます。デモのところで

<? 
class A { 
    protected static $foo = "bar"; 

    public function bar() { 
    echo self::$foo; 
    } 
} 

class B extends A { } 

$a = new A(); 
$a->bar(); 

$b = new B(); 
$b->bar(); 
?> 

出力がbarbarです。しかし、直接アクセスしようとすると:

echo A::$foo; 

PHPは、保護されたメンバーにアクセスしようとすると、あなたに正しく苦情を言います。

+0

それでは、なぜ静的に自己を使うのでしょうか?例えば。 self :: $ fooまたはstatic :: $ foo –

+0

クラス外で試してみるといいですが、クラスメソッド内でアクセスしようとしています。 –

+0

A-> foo()を定義し、 'self :: $ foo'を呼び出すと、Aで定義された静的$ fooが返されます。AをBの一部としてサブクラス化した場合、継承したfoo )、それはAからの$ fooをBで定義したとしても使用します。static :: $ fooを使用すると、Bで定義された$ fooが使用されます。 –

関連する問題