14

私は最近いくつかのクラス ファイルに取り組んでおり、メンバ変数が protected static $_someVar のような保護された静的モードで設定され、static::$_someVar のようにアクセスされていることに気付きました。

可視性の概念を理解しています。また、保護された静的として設定されたものがあると、メンバー変数はスーパークラスまたは派生クラスでのみアクセスできるようになりますが、静的メソッドでのみ保護された静的変数にアクセスできますか?

ありがとう

4

2 に答える 2

45

私の理解が正しければ、あなたが言及しているのは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)。$_foostatic

そしてもちろん、可視性とスコープは依然として重要ですが、静的メソッド (つまり、オブジェクト コンテキスト) の外部にある静的な保護されたメンバーにアクセスできます。

于 2010-11-25T21:22:13.203 に答える
7

静的変数は、クラスのインスタンスではなく、クラスに存在します。非静的メソッドからアクセスして、次のように呼び出すことができます。

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 は適切に文句を言います。

于 2010-11-25T18:43:19.747 に答える