我今天遇到了一些使用PHP的后期静态绑定的代码,而使用它的方式对我来说没有意义。后期静态绑定对我来说是一个新概念,因此我想尽力解决这个问题。
研究了Github Gist并阅读了Stack Overflow的这篇文章之后,我了解了后期静态绑定的用途以及使用它的原因。现在,我正在尝试将其应用于正在查看的代码,这对我来说没有任何意义。感觉static
关键字的使用不正确。这或多或少是我不确定的代码:
<?php
class myClass
{
const MY_CONST = 'some string';
public function getMyConst()
{
return static::MY_CONST;
}
}
$c = new myClass();
print_r($c->getMyConst());
假设我理解这个概念,那么后期静态绑定使您可以在静态上下文中引用孩子的const。因此,在代码中,我看到的是没有继承,也没有静态函数,因此在这种特殊用例中使用static
关键字和self
关键字有什么意义?另外,假设以不正确的方式使用了static
关键字是否有任何伤害(或者可能与预期使用的目的不完全相同)?
答案 0 :(得分:1)
在这种特殊情况下,使用$c::MY_CONST
,self::MY_CONST
,static::MY_CONST
,myClass:MY_CONST
将具有相同的效果。但是看起来您的类并未声明为final且可以扩展,并且在扩展时,static关键字将使用后期绑定指向const。
使用后期绑定总是要付出代价的,但是它不是C ++,因此您不会在资源匮乏的底层上编写驱动程序。费用根本不会引起注意。但是,不使用静态可能会导致将来很难检测到错误。
In PHP manual,您还可以找到有关PHP后期绑定的有趣内容
最新的静态绑定通过存储最后一个“非转发调用”中命名的类来工作。在静态方法调用的情况下,这是显式命名的类(通常是::运算符左侧的类);如果是非静态方法调用,则为对象的类。
此功能被命名为“后期静态绑定”,同时考虑了内部视角。 “后期绑定”来自以下事实:static ::不会使用定义方法的类来解析,而是使用运行时信息来计算。