为什么php允许在子类中更改const?

时间:2017-07-11 09:36:21

标签: php const

我不明白为什么以下代码有效。是不是在子类中重新定义STEALTH ...虽然在父类中声明为const?仅供参考,我的印象是const阻止变量被重新定义!

  class Person {
    const STEALTH = "MINIMUM";
  }

  class Ninja extends Person {          
    const STEALTH = "MAXIMUM";
  }

  echo Ninja::STEALTH; // prints out 'MAXIMUM'

请注意,我不是在询问范围解析运算符。我想我理解打印Ninja::STEALTHPerson::STEALTH之间的区别。我很惊讶ninja能够继承一个const变量而且能够重新定义它!

2 个答案:

答案 0 :(得分:1)

  

我的印象是const阻止变量被重新定义!

const会阻止修改该值。

使用define()无法定义具有相同名称的两个不同对象。也不可能使用const定义具有相同名称的两个不同对象。始终使用其全名(类名+ const +常量名称)访问::类成员。

STEALTH类定义的Person常量的名称为Person::STEALTHNinja类声明常量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::STEALTHPerson::STEALTH 1

类常量是具有奇特名称的全局对象(以及自PHP 7.0以来的类可见性修饰符)。

答案 1 :(得分:1)

const仅表示该值不能在运行时更改。它不限制类通过相同名称独立定义常量;唯一的事情是继承规则将定义父母的价值何时以及如何被儿童遮蔽。