php静态变量的静态绑定概念

静态变量在php类中很常用,常作为类成员属性来使用。
使用static关键字定义静态变量

class Foo
{
    public static $prop;
}

在类中通过self::$var来使用静态变量

class Foo
{
    public static $prop = 'is Foo prop';

    public function showProp()
    {       
        var_dump(self::$prop); 
    }
}
$foo = new Foo();
$foo->showProp(); // 输出;  is Foo prop

类继承的场景下

class B extends Foo
{
    public static $prop = 'is B prop';
}
$b = new B();
$b->showProp(); // 输出;  is Foo prop

这种场景下,我们希望的是 B对象调用showProp() 方法输出 is B prop,这里有两种方法实现
方法一: 在B类中重写 showProp() 方法

class B extends Foo
{
    public static $prop = 'is B prop';

    public function showProp()
    {
        var_dump(self::$prop);
    }
}

很显然这种方式不合适的,本末倒置,失去了类继承的意义
方法二:我们经常会有这样的场景,在子类中覆盖了父类的静态变量,希望父类的方法用当前类设置的值,那么上面那种方式就不适用,这里就要用到使用静态变量的另外一种方式 static::$var

class Foo
{
    public static $prop = 'is Foo prop';

    public function showProp()
    {       
        var_dump(static::$prop); 
    }
}
class B extends Foo
{
    public static $prop = 'is B prop';
}

$foo = new Foo();
$foo->showProp(); // 输出;  is Foo prop

$b = new B();
$b->showProp(); // 输出; is B prop

这就涉及到了静态绑定概念
self:: 获取当前调用的方法所在类的定义
static:: 获取的是静态绑定后的值(即实例化对象的定义)

涉及到静态绑定的,还有php内置的两个函数
get_class () 和 get_called_class()

get_class ()    获取当前调用方法的类名
get_called_class() 获取静态绑定后的类名

class Foo
{
    public function test()
    {
        var_dump(get_class());
    }

    public function test2()
    {
        var_dump(get_called_class());
    }

    public static function test3()
    {
        var_dump(get_class());
    }

    public static function test4()
    {
        var_dump(get_called_class());
    }
}

class B extends Foo{}

$b = new B();
$b->test(); // Foo
$b->test2(); // B
Foo::test3(); // Foo
Foo::test4(); // Foo
B::test3(); // Foo
B::test4(); // B

总结:在使用静态变量时更推荐 用 static的方式使用,在获取当前类名时也推荐使用 get_called_class() 函数

posted @ 2021-06-24 15:01  进击的鱼儿  阅读(105)  评论(0编辑  收藏  举报