为什么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::隐身
是同一个对象,而不是副本。这对于
静态
属性来说很麻烦(对于
常量
来说没有那么麻烦,因为它们无法更改)。我想我会重新制定答案。