PHP常量继承与self::X
的含义:PHP 7前后行为差异详解
本文分析PHP常量继承中的一个细节问题,解释其在PHP 7前后版本中输出结果不同的原因。以下代码片段展示了该问题:
class a{ const x=1; const y=self::x; } class b extends a{ const x=1.0; } var_dump(b::y); // PHP 7之前:float(1.0);PHP 7及之后:int(1)
为什么PHP 7前后输出结果不同?关键在于self::x
的含义。
许多开发者误认为self::x
会继承父类a
的x
常量。然而,self
关键字指的是当前类,而非父类。因此,在a
类中定义const y = self::x;
时,self::x
实际上等同于a::x
,y
常量被赋值为整数1。
当子类b
继承a
并重新定义x
常量为浮点数1.0时,b::y
的值不会改变。这是因为y
常量在a
类中定义时,self::x
的值已经确定为整数1,并赋值给了y
。即使b
类重新定义了x
,也不会影响a
类中已定义的y
常量的值。
PHP 7之前的版本,由于类型转换机制或兼容性问题,var_dump
输出float(1.0)
。PHP 7及以后的版本更严格地遵循常量的定义,y
的值保持最初赋值的整数1,因此输出int(1)
。这体现了PHP 7在常量处理上的改进,使其行为更符合预期。
因此,以下代码与最初的a
类定义等效:
class A{ const X=1; const Y=A::X; // 等同于 const Y = 1; }
理解self
关键字的含义以及PHP 7对常量处理的改进,就能清晰地解释为什么b::y
的输出值会随着PHP版本的不同而变化。