我不明白为什么以下代码有效。是不是在子类中重新定义STEALTH
...虽然在父类中声明为const
?仅供参考,我的印象是const
阻止变量被重新定义!
class Person {
const STEALTH = "MINIMUM";
}
class Ninja extends Person {
const STEALTH = "MAXIMUM";
}
echo Ninja::STEALTH; // prints out 'MAXIMUM'
请注意,我不是在询问范围解析运算符。我想我理解打印Ninja::STEALTH
与Person::STEALTH
之间的区别。我很惊讶ninja能够继承一个const变量而且能够重新定义它!
答案 0 :(得分:1)
我的印象是const阻止变量被重新定义!
const
会阻止修改该值。
使用define()
无法定义具有相同名称的两个不同对象。也不可能使用const
定义具有相同名称的两个不同对象。始终使用其全名(类名+ const
+常量名称)访问::
类成员。
STEALTH
类定义的Person
常量的名称为Person::STEALTH
。 Ninja
类声明常量Ninja::STEALTH
。
它们是不同的对象。
const
(和static
)类属性的继承方式与实例属性的继承方式不同。如果基类定义的const
属性未被子类定义的具有相同名称的另一个对象屏蔽,则基类const
属性将复制到子类中,并且可以使用子类名。
例如:
class Person {
const STEALTH = "MINIMUM";
}
class Citizen extends Person {
}
class Ninja extends Person {
const STEALTH = "MAXIMUM";
}
echo Person::STEALTH; // prints out 'MINIMUM'
echo Citizen::STEALTH; // prints out 'MINIMUM'; same as Person::STEALTH
echo Ninja::STEALTH; // prints out 'MAXIMUM'
因为类Citizen
扩展了类Person
并且它没有定义自己的STEALTH
常量,Citizen::STEALTH
是Person::STEALTH
1
类常量是具有奇特名称的全局对象(以及自PHP 7.0以来的类可见性修饰符)。
答案 1 :(得分:1)
const
仅表示该值不能在运行时更改。它不限制类通过相同名称独立定义常量;唯一的事情是继承规则将定义父母的价值何时以及如何被儿童遮蔽。