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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值