PHPマニュアルのstatic

4022 ワード

前言
PHPマニュアルシリーズの文章は、いくつかのマニュアルの中の面白い評論を選んで翻訳マニュアルカタログを行います:言語の参考---類と対象---staticの参考の詳細
コメント
  • 親static変数を子クラスで上書きし、親メソッドを呼び出して子クラスのstaticを変更します.結果は予想通り
  • にはなりません.
    class A {
        protected static $a;
    
        public static function init($value) { self::$a = $value; }
        public static function getA() { return self::$a; }
    }
    
    class B extends A {
        protected static $a; // redefine $a for own use
    
        // inherit the init() method
        public static function getA() { return self::$a; }
    }
    
    B::init('lala');
    echo 'A::$a = '.A::getA().'; B::$a = '.B::getA();
    

    出力A::$a=lala; B::$a=、使用B::init()はA::staticへの変更です.ここでA::init()はselfをstaticに変更して遅延バインドする必要があります.
  • static変数は、サブクラス間で
  • を共有することができる.
    class MyParent {
        protected static $variable;
    }
    class Child1 extends MyParent {
        function set() {
            self::$variable = 2;
        }
    }
    class Child2 extends MyParent {
        function show() {
            echo(self::$variable);
        }
    }
    
    $c1 = new Child1();
    $c1->set();
    $c2 = new Child2();
    $c2->show(); // prints 2
    
  • 次のようにコードを書こうとするとfatal error
  • が発生します.
    class Base
    {
        static function Foo ()
        {
            self::Bar();
        }
    }
    
    class Derived extends Base
    {
        function Bar ()
        {
            echo "Derived::Bar()";
        }
    }
    Derived::Foo(); // we want this to print "Derived::Bar()",but sorry,fatal error!
    

    phpのself::は、実際に呼び出すselfのクラスではなく、そのコードが存在するクラスの属性または方法のみを指す.__CLASS__の代わりにselfを使用することはできません.それは二度と現れないからです.:の前にあり、selfと同じように実際に呼び出されたクラスを指すことはできません.このように座らなければならない場合は、下を使用する必要があります.
    class Base
    {
        static function Foo ($class = __CLASS__)
        {
            //$class::Bar();
            call_user_func(array($class,'Bar'));
        }
    }
    
    class Derived extends Base
    {
        function Bar ()
        {
            echo "Derived::Bar()";
        }
    }
    
    Derived::Foo('Derived');  //output Derived::Bar()
    
  • 以前にselfがコードクラスを指す問題について議論したが、$thisキーワードはselfとは異なり、呼び出されたクラスインスタンス
  • を指す.
    class a {
        public function get () {
            echo $this->connect();
        }
    }
    class b extends a {
        private static $a;
        public function connect() {
            return self::$a = 'b';
        }
    }
    class c extends a {
        private static $a;
        public function connect() {
            return self::$a = 'c';
        }
    }
    $b = new b ();
    $c = new c ();
    
    $b->get(); //output b
    $c->get();  //output c
    
    class afunction get()は、呼び出しクラスによって異なる$thisを解釈する
  • あるクラスが継承されると、そのstatic属性も「継承を参照」(カスタマイズされた言い方、分かりやすく、以下同じ)されて子クラス、すなわち子クラスと親クラスが共にstaticを保有し、彼らのいずれかのstaticの変更は
  • に相互に影響します.
    class a
    {
      public static $s;
      public function get()
      {
        return self::$s;
      }
    }
    
    class b extends a { }
    class c extends b { }
    a::$s = 'a';
    $c = new c();
    echo $c->get(); // a
    

    ただし、同じシーンでstaticメソッドまたは非staticメソッドが「コピー継承」されている場合、このメソッド内のstatic変数または非static変数は異なるクラスで互いに独立します.
    class a
    {
      public final function v($vs = null)
      {
        static $s = null;
        if(!is_null($vs))
        $s = $vs;
        return $s;
      }
    }
    
    class b extends a { }
    class c extends b { }
    $a = new a();
    $a->v('a');
    $aa = new a();
    $aa->v('last a');
    $c = new c();
    $c->v('c');
    echo $a->v().' - '.$c->v(); // last a - c
    

    このときのクラスcとクラスaのfunction vに対する操作は互いに独立しており,ここでfunction vはfinalキーワードを用い,サブクラスのvに対する上書きを防止できる.
  • 別の親アクセスサブクラスstatic属性の方
  • class A {
        public static $my_vars = "I'm in A";
        static function find($class) {
            $vars = get_class_vars($class) ;
            echo $vars['my_vars'] ;
        }
    }
    class B extends A {
        public static $my_vars = "I'm in B";
    }
    
    A::find("B"); // Result : "I'm in B"
    

    実際には、クラスBを渡すと、$class::$my_varsを直接使用して呼び出すことができます.ここでは、異なる方法としてのみ使用します.