【问题标题】:Why does php allows const to be changed in subclasses?为什么 php 允许在子类中更改 const?
【发布时间】:2017-07-11 09:36:20
【问题描述】:

我不明白为什么下面的代码有效。 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 变量,但又能够重新定义它!

【问题讨论】:

  • 谁说它被重新定义了?
  • Person::STEALTHNinja::STEALTH 显然是两个不同的东西……
  • @deceze 是的,我可以看到。我不是在询问范围解析运算符。我很惊讶 ninja 继承了 person 却能够重新定义 STEALTH
  • 这里没有重新定义。您有 两个 不同的常量。

标签: php constants


【解决方案1】:

const 仅表示该值不能在运行时更改。它不限制类独立定义同名常量;唯一的问题是继承规则将定义父值何时以及如何被子值遮蔽。

【讨论】:

    【解决方案2】:

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

    const 阻止修改值。

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

    Person 类定义的STEALTH 常量的名称是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 起的类可见性修饰符)。

    【讨论】:

    • 好吧……这对我来说更有意义了!谢谢!
    • 看来const 变量是继承的。我在忍者课上注释掉了const STEALTH = "MAXIMUM";.. 并且仍然能够打印出Ninja::STEALTH。它打印了MINIMUM....的继承值。我又糊涂了!
    • 确实,基类的conststatic 类属性都可以使用子类的名称从子类访问。从这个角度来看,它们是继承的。我的意思是Ninja::STEALTHPerson::STEALTH 是同一个对象,而不是副本。这在static 属性上很麻烦(在const 上不是那么麻烦,因为它们无法更改)。我想我会重新制定答案。
    猜你喜欢
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    • 1970-01-01
    • 2020-08-01
    • 2016-10-25
    • 2019-08-06
    相关资源
    最近更新 更多