从这个名字的定义提取出两个关键点,第一点静态,也就是说这个功能只适用于静态属性或静态方法。
第二点延迟绑定,这个根据下面代码就能够很好的理解
看一下这个例子:php
class A{ static $name = "Tom"; public function printName(){ echo self::$name."\n"; self::fun(); } static function fun(){ echo "A Class\n"; } } class B extends A{ static $name = "Jon"; static function fun(){ echo "B Class\n"; } } $obj = new B(); $obj->printName(); // 输出结果 // Tom // A Class
我在printName函数里面使用了self关键字,self是指向当前类的"指针",
因此不少人会理想的认为输出结果会是这样:函数
// Join // B Class
是这样的,在定义A类的是时候,在函数printName里面使用self关键字调用了静态方法或属性,
可是这个函数一旦定义好,A类的静态方法和属性就被绑定到函数了,不要去追究为何,php就是这么实现的,
可是咱们如今要实现这样的效果,就是函数定义好后里面使用到的静态方法和属性不要当即绑定死,
而是根据最终继承的类来肯定绑定。
因此php在5.5之后使用了static关键字来解决这个问题,解决后的代码例子以下:
spa
class A{ static $name = "Tom"; public function printName(){ echo static::$name."\n"; static::fun(); } static function fun(){ echo "A Class\n"; } } class B extends A{ static $name = "Jon"; static function fun(){ echo "B Class\n"; } } $obj = new B(); $obj->printName(); // 输出结果 // Join // B Class
你们能够在项目中自行挖掘使用场景,好比一个会员父类 class Vip
下面两个子类分别是 超级会员 svip 和 年费会员 yvip
能够在两个子类中分别重写 static usergroup() 方法 或者其余静态属性 ,父类中使用延迟静态绑定
这样能够写出很优雅的代码
指针