php中的后期静态绑定,"Late Static Binding"

在我们以往中,在类中使用self关键字的时候都是指向了被调用方法定义时的类,而非原始的调用类。

例如:

class Animal{
  static $IQ_lv_avg = 1;
  public static function myiqlvavg(){
    echo self::$IQ_lv_avg.PHP_EOL;
  }
  public static function test(){
    self::myiqlvavg();
  }

}

class Dog extends Animal{
  static $IQ_lv_avg = 3;
  public static function myiqlvavg(){
    echo self::$IQ_lv_avg.PHP_EOL;
  }

}

Dog::test();//echo 1

我们可以得到最后得到的平均IQ等级是1

self指向的是定义其所在方法的类。

我们如果想执行Dog类,也就是调用类的静态方法怎么办呢?

静态后期绑定可以做到。

使用方法其实就是使用static关键字。

例如:

class GrandparentClass{

  static $age = 40;
  public static function foo(){
    static::whatMyAge();
}

  public static function whatMyAge(){
    echo __CLASS__.PHP_EOL;
  }
}

class ParentClass extends GrandparentClass{

     static $age = 60;
  public static function start(){
    GrandparentClass::foo();
    parent::foo();
    self::foo();
  }
}

class ChildrenClass extends ParentClass{

static $age = 90;
  public static function whatMyAge(){
    echo __CLASS__.PHP_EOL;
  }
}
ChildrenClass::start();

最终获得的年代为:

40 90 90

在静态方法中,我们可以使用get_called_class()函数得知调用静态方法的类名。

例如:

class foo {
    static public function test() {
        var_dump(get_called_class());
    }
}

class bar extends foo {
}

foo::test();//echo foo
bar::test();//echo bar

在php 5.5之后可以使用static::class 达到get_called_class()同效果。

Note:可以直接调用phpversion函数查看当前php版本,或者cli模式查看,总之方法多多。