PHP中如何形成static::与new static()的静态绑定

互联网 20-6-6

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  }

二、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里调用

三、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

推荐教程:《PHP视频教程》

以上就是PHP中如何形成static::与new static()的静态绑定的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: 静态绑定
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:PHP中$是什么意思?

相关资讯