php类中self和static的区别以及后期静态绑定(late static binding)

901字
3分钟阅读
2018-11-30 14:23
技术笔记

从PHP5.3开始,PHP增加了后期静态绑定(LSB,Late Static Bindings)的功能,“后期绑定”即指不再在编译时解析为定义方法所在的类,而是在实际运行时根据实际调用上下文来确定。这也是staticself关键词的区别所在。

self的局限性

self只能对定义方法所在的类进行调用,如

<?php
<?php  

class Animals  
{  
    const NAME = 'Animals';  

    public static function getName(): void  
    {  
        echo self::NAME;  
    }  
}  

class Birds extends Animals  
{  
    const NAME = 'Birds';  

}  

class Chicken extends Birds  
{  
    const NAME = 'Chicken';  
}  

Chicken::getName(); //Animals
Birds::getName(); //Animals

self只对定义该方法的类内起作用,所以子类调用getType()获取到的也是Animals类的属性。

static和后期静态绑定

如果我们希望在不复写方法的情况下实时获取子类的属性,self显然无法达到我们预期的效果,此时static便提供解析问题的方案。

static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的。也可以称之为“静态绑定”,因为它可以用于(但不限于)静态方法的调用。[1]

同样的结构:

<?php  

class Animals  
{  
    const NAME = 'Animals';  

    public static function getName(): void  
    {  
        echo static::NAME;  
    }  
}  

class Birds extends Animals  
{  
    const NAME = 'Birds';  

}  

class Chicken extends Birds  
{  
    const NAME = 'Chicken';  
}  

Chicken::getName(); //Chicken  
Birds::getName(); //Birds

当我们把self换成static后,此时取得便是完全解析了的静态调用,可以在不改变调用方法的情况下实时获取到子类的静态属性。

参考文献

  1. PHP手册

发表评论

您的邮箱地址不会被公开。必填项已用*标注

评论列表

0 条评论

暂无评论

成为第一个评论者吧!