- A+
所属分类:PHP
首先我们来看下,self和static的区别:
class A { public static $num = 1; public static function show(){ echo self::$num; echo '<br/>'; echo static::$num; } } A::show();
输出结果:
1 1
我们再来看:
class A { public static $num = 1; public static function show(){ echo self::$num; echo '<br/>'; echo static::$num; } } class B extends A { public static $num = 2; } B::show();
输出结果:
1 2
可以看出: 当子类覆盖父类的静态属性时,self 输出依然是父类的静态属性值,而static 输出的则是子类的静态属性值。
在前面我们介绍过PHP的单例实现方式:https://xjwblog.com/?p=336
那么,当子类继承父类时,就不用在重复实现getInstance(),而是将父类的static::$instance绑定为子类,这就是PHP延时静态绑定。
实现方式:
class A { private static $instance = []; /** * @return static */ public static function getInstance() { $class = get_called_class(); if(!isset(self::$instance[$class]) || !self::$instance[$class] instanceof $class){ self::$instance[$class] = new static(); } return self::$instance[$class]; } }