为什么php允许在子类中更改const?
我不明白为什么下面的代码可以工作。子类中是否重新定义了为什么php允许在子类中更改const?,php,constants,Php,Constants,我不明白为什么下面的代码可以工作。子类中是否重新定义了隐身。。。尽管它在父级中声明为const?仅供参考,我的印象是const会阻止变量被重新定义 class Person { const STEALTH = "MINIMUM"; } class Ninja extends Person { const STEALTH = "MAXIMUM"; } echo Ninja::STEALTH; // prints out 'MAXIMUM'
隐身
。。。尽管它在父级中声明为const
?仅供参考,我的印象是const
会阻止变量被重新定义
class Person {
const STEALTH = "MINIMUM";
}
class Ninja extends Person {
const STEALTH = "MAXIMUM";
}
echo Ninja::STEALTH; // prints out 'MAXIMUM'
请注意,我不是在询问范围解析运算符。我想我理解打印出《忍者:隐身》和《个人:隐身》之间的区别。我只是惊讶于忍者能够继承常量变量,却能够重新定义它
我的印象是const阻止变量被重新定义
class Person {
const STEALTH = "MINIMUM";
}
class Ninja extends Person {
const STEALTH = "MAXIMUM";
}
echo Ninja::STEALTH; // prints out 'MAXIMUM'
const
阻止修改该值
无法使用定义具有相同名称的两个不同对象。使用const
也无法定义具有相同名称的两个不同对象。常量
类成员始终使用其全名(类名+::
+常量名)进行访问
Person
类定义的steave
常量的名称是Person::steave
。Ninja
类声明常量Ninja::隐身
它们是不同的对象
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
,并且它没有定义自己的隐形常量,Citizen::隐形
是Person::隐形1的副本
类常量是具有奇特名称的全局对象(以及自PHP 7.0以来的类可见性修饰符)。const
仅意味着在运行时无法更改该值。它不限制类以相同的名称独立定义常量;唯一的问题是继承规则将定义父项的值何时以及如何被子项的值隐藏。可能重复谁说它被重新定义了?Person::隐身
和Ninja::隐身
显然是两件不同的事情…@deceze是的,我可以看到。我不是在问范围解析操作符。我很惊讶忍者继承了person,却能够重新定义隐身。这里没有重新定义。你有两个不同的常数,好的。。。这对我来说更有意义了!非常感谢。似乎const
变量是继承的。我注释掉了const steave=“max”代码>在忍者类中。。并且仍然能够打印出《忍者:隐形》
。它打印继承的最小值
。。。。我又被搞糊涂了!实际上,基类的const
和static
类属性都可以使用子类的名称从子类访问。从这个角度来看,它们是继承的。我的意思是,Ninja::隐身
与Person::隐身
是同一个对象,而不是副本。这对于静态
属性来说很麻烦(对于常量
来说没有那么麻烦,因为它们无法更改)。我想我会重新制定答案。