加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

在PHP中如何形成static与new static的静态绑定

发布时间:2022-06-24 13:13:52 所属栏目:PHP教程 来源:互联网
导读:PHP中static::与new static()之后期静态绑定 一、parent、self、$this、__CLASS__ class A {} class B extends A{ parent::(public|protected)(静态方法|静态变量) === parent永远是A self::(public|protected)(静态方法|静态变量) === self永远是B $this-
  PHP中static::与new static()之后期静态绑定
 
  一、parent、self、$this、__CLASS__
 
  class A {}
  
  class B extends A{
  
  parent::(public|protected)(静态方法|静态变量)  ===> parent永远是A
  
  self::(public|protected)(静态方法|静态变量)  ===> self永远是B
  
  $this->(public|protected)(非静态方法|非静态变量)  ===> $this永远是B的是实例化对象
  
  __CLASS__    ===> 永远是B
  
  }  
  
  class C extends B{
  
  parent::(public|protected)(静态方法|静态变量)  ===> parent永远是B
  
  self::(public|protected)(静态方法|静态变量)  ===> self永远是C
  
  $this->(public|protected)(非静态方法|非静态变量)  ===> $this永远是C的是实例化对象
  
  __CLASS__    ===> 永远是C  
  
  }

  二、new static()
 
  //new self()与new static()的区别,官网例子如下:  
  
  class A {
  
    public static function get_self() {
  
      return new self();
  
    }
  
    public static function get_static() {
  
      return new static();
  
    }
  
  }
  
  class B extends A {}
  
  echo get_class(B::get_self()); // A
  
  echo get_class(B::get_static()); // B
  
  echo get_class(A::get_static()); // A。

  三、static::
 
  static关键字可以实现以下功能:
 
  1 调用类的静态方法 有后期静态绑定效果;
 
  2 调用类的静态属性 有后期静态绑定效果;
 
  3 调用类的非静态方法 没有后期静态绑定效果;
 
  4 注意:不可以调用非静态属性;
 
  class A {
  
      private static function foo() {
  
          echo "A success!n";
  
      }
  
      public function test() {
  
           $this->foo();
  
      }
  
  }
  
  class B extends A {
  
  }
  
  class C extends A {
  
      private static function foo() {
  
      echo "C success!n";
  
      }
  
  }
  
  $b = new B();
  
  $b->test();//A success!
  
  $c = new C();
  
  $c->test();//A success!
  
  class A {
  
      private static function foo() {
  
          echo "A success!n";
  
      }
  
      public function test() {
  
          static::foo();
  
      }
  
  }
  
  class B extends A {
  
  }
  
  class C extends A {
  
      private static function foo() {
  
      echo "C success!n";
  
      }
  
  }

  $b = new B();
  
  $b->test();//A success!
  
  $c = new C();
  
  $c->test();//A无法调用C里的私有foo方法  
  
  //将C的foo改成非private(public|protected)就可以解决
  
  class A {
  
      private static function foo() {
  
          echo "A success!n";
  
      }
  
      public function test() {
  
          static::foo();
  
      }
  
  }
  
  class B extends A {
  
  }
  
  class C extends A {
  
      public static function foo() {
  
      echo "C success!n";
  
      }
  
  }
  
  $b = new B();
  
  $b->test();//A success!
  
  $c = new C();
  
  $c->test();//C success!

  class A {
  
   public static function foo() {
  
       static::who();
  
   }
  
   public static function who() {
  
       echo __CLASS__."n";
  
   }
  
  }

  class B extends A {
  
   public static function test() {
  
       A::foo();
  
       parent::foo();
  
       self::foo();
  
   }
  
   public static function who() {
  
       echo __CLASS__."n";
  
   }
  
  }
  
  class C extends B {
  
   public static function who() {
  
       echo __CLASS__."n";
  
   }  
  
  }
  
  C::test();  
  A =>A::foo()的结果
 
  C =>parent::foo()能走到A的foo,里面static::who找C::who
 
  C =>self::foo()能走到B的foo,B继承A,走到A的foo,里面static::who找C::who
 
  class A {
  
      protected static function foo() {
  
          static::who();
  
      }
  
      protected static function who() {
  
          echo __CLASS__."n";
  
      }
  
  }
  
  class B extends A {
  
      public static function test() {
  
          A::foo();
  
          parent::foo();
  
          self::foo();
  
      }

      protected static function who() {
  
          echo __CLASS__."n";
  
      }
  
  }
  
  class C extends B {
  
      protected static function who() {
  
          echo __CLASS__."n";
  
      }  
  
  }


  C::test(); //A C C,解释同上

  class A {
  
   public static function foo() {
  
       static::who();
  
   }
  
   private static function who() {
  
       echo __CLASS__."n";
  
   }
  
  }
  
  class B extends A {
  
   public static function test() {
  
       A::foo();
  
       parent::foo();
  
       // self::foo();   
  
   }

   private static function who() {
  
       echo __CLASS__."n";
  
   }
  
  }
  
  class C extends B {
  
   private static function who() {
  
       echo __CLASS__."n";
  
   }  
  
  }

  C::test();
  
  //A =>A::foo()的结果  
  
  //报错 A不可C的私有方法who => parent::foo()能走到A的foo,里面static::who找C::who,C的who只能在C里调用,不能在A里调用
  
  //报错 A不可C的私有方法who => self::foo()能走到B的foo,B继承A,走到A的foo,里面static::who找C::who,C的who只能在C里调用,不能在A里调用。

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读