私は最近いくつかのクラス ファイルに取り組んでおり、メンバ変数が protected static $_someVar のような保護された静的モードで設定され、static::$_someVar のようにアクセスされていることに気付きました。
可視性の概念を理解しています。また、保護された静的として設定されたものがあると、メンバー変数はスーパークラスまたは派生クラスでのみアクセスできるようになりますが、静的メソッドでのみ保護された静的変数にアクセスできますか?
ありがとう
私は最近いくつかのクラス ファイルに取り組んでおり、メンバ変数が protected static $_someVar のような保護された静的モードで設定され、static::$_someVar のようにアクセスされていることに気付きました。
可視性の概念を理解しています。また、保護された静的として設定されたものがあると、メンバー変数はスーパークラスまたは派生クラスでのみアクセスできるようになりますが、静的メソッドでのみ保護された静的変数にアクセスできますか?
ありがとう
私の理解が正しければ、あなたが言及しているのはlate-static bindingsと呼ばれます。あなたがこれを持っている場合:
class A {
protected static $_foo = 'bar';
protected static function test() {
echo self::$_foo;
}
}
class B extends A {
protected static $_foo = 'baz';
}
B::test(); // outputs 'bar'
self
ビットを次のように変更した場合:
echo static::$_foo;
次に、次のようにします。
B::test(); // outputs 'baz'
なぜなら、定義されself
たクラスを参照するため (A)、実行時にそれを呼び出したクラスを参照する間 (B)。$_foo
static
そしてもちろん、可視性とスコープは依然として重要ですが、静的メソッド (つまり、オブジェクト コンテキスト) の外部にある静的な保護されたメンバーにアクセスできます。
静的変数は、クラスのインスタンスではなく、クラスに存在します。非静的メソッドからアクセスして、次のように呼び出すことができます。
self::$_someVar
これが機能する理由self
は、現在のインスタンス (のように) ではなく、現在のクラスへの参照であるため$this
です。
デモンストレーションとして:
<?
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 は適切に文句を言います。