PHP延时静态绑定以及self 和 static 的区别

  • 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];
        }
}
avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: