3 回答
![?](http://img1.sycdn.imooc.com/545865470001bf9402200220-100-100.jpg)
TA贡献2016条经验 获得超9个赞
你肯定需要在PHP手册中阅读Late Static Bindings。但是,我会尽量给你一个快速摘要。
基本上,它归结为self关键字不遵循相同的继承规则这一事实。 self总是解析为使用它的类。这意味着如果您在父类中创建一个方法并从子类调用它,self则不会像您期望的那样引用该子类。
后期静态绑定引入了static关键字的新用途,它解决了这个特殊的缺点。使用时static,它代表您首次使用它的类,即。它“绑定”到运行时类。
这是它背后的两个基本概念。这种方式self,parent以及在播放static时的操作static可能是微妙的,所以我强烈建议您学习手册页示例,而不是详细介绍。一旦理解了每个关键字的基础知识,就可以通过这些示例来了解您将获得哪种结果。
![?](http://img1.sycdn.imooc.com/5458463b0001358f02200220-100-100.jpg)
TA贡献1993条经验 获得超5个赞
从PHP 5.3.0开始,PHP实现了一个称为后期静态绑定的功能,可用于在静态继承的上下文中引用被调用的类。
后期静态绑定试图通过引入一个引用最初在运行时调用的类的关键字来解决该限制。决定不引入新的关键字,而是使用static已经保留的关键字。
我们来看一个例子:
<?php
class Car
{
public static function run()
{
return static::getName();
}
private static function getName()
{
return 'Car';
}
}
class Toyota extends Car
{
public static function getName()
{
return 'Toyota';
}
}
echo Car::run(); // Output: Car
echo Toyota::run(); // Output: Toyota
?>
late static bindings通过存储在最后一次“非转发呼叫”中命名的类来工作。在静态方法调用的情况下,这是显式命名的类(通常是::运算符左侧的类); 在非静态方法调用的情况下,它是对象的类。
A“转发呼叫”是通过引入一个静态self::,parent::,static::,或者,如果在类层次结构往上走,forward_static_call()。
该函数get_called_class()可用于检索具有被调用类名称的字符串并static::引入其范围。
![?](http://img1.sycdn.imooc.com/54584dd900014f6c02200220-100-100.jpg)
TA贡献1842条经验 获得超12个赞
行为不是很明显:
以下代码生成'alphabeta'。
class alpha {
function classname(){
return __CLASS__;
}
function selfname(){
return self::classname();
}
function staticname(){
return static::classname();
}
}
class beta extends alpha {
function classname(){
return __CLASS__;
}
}
$beta = new beta();
echo $beta->selfname(); // Output: alpha
echo $beta->staticname(); // Output: beta
但是,如果我们从beta类中删除classname函数的声明,我们会得到'alphaalpha'作为结果。
- 3 回答
- 0 关注
- 421 浏览
添加回答
举报