PHP的self::与static::,new self()和new static()之分

//后期静态绑定
class A {
   public static function who() {
      var_dump("I'm A");
   }
   public static function test() {
      self::who();
   }
   public static function staticT() {
      static::who();
   }
   public function who1() {
      var_dump("I'm A who1");
   }
   public static function staticT1() {
//    static::who1(); //who1不是static方法, 错误
      (new static())->who1(); //用new static()创建新的静态域对象(具体是哪个类对象,则根据运行的类计算,跟static定义所在类无关),用->调用非静态方法
      (new self())->who1(); //永远是A的who1()方法, self::只跟其定义所在类相关
   }
}

class B extends A {
   public static function who() {
      var_dump("I'm B");
   }
   public function who1() {
      var_dump("I'm B1 who1");
   }
}

class B1 extends A {
   public static function who() {
      var_dump("I'm B1");
   }
   public static function test() {
      self::who();
   }
}
B::test();  //I'm A, 因为self::在A中,所以只会调用A的who()方法
B1::test(); //I'm B1, 因为B1\A都有self::, 但B1重载了A中的test()方法, 所以B1中的self::只会调用B1的方法

B::staticT(); //I'm B,因为static::是一个全局的静态域, 不局限于其定义所在的类,因此B重载了A的who()静态方法, static::会调用B的who()
B1::staticT(); //I'm B1,与上同理

B::staticT1(); //I'm B1 who1, I'm A who1, 解释看代码
die;

你可能感兴趣的:(PHP)