【问题标题】:Accessing constants inside PHP object [closed]访问 PHP 对象中的常量 [关闭]
【发布时间】:2012-10-18 02:34:42
【问题描述】:

目前我正在阅读 PHP 5 OOP (properties section) 并在那里找到了以下语句:

在类方法中,属性、常量和方法可以是 使用 $this->property

形式访问

这很奇怪,但我无法使用该格式访问常量。以下代码会引起注意:

class A
{
    const HELLO = 'HELLO WORLD';

    public function __construct()
    {
        echo $this->HELLO;
    }
}

$a = new A();

我是否误解了某些内容或文档作者犯了错误?

【问题讨论】:

  • @NullUserException: 类常量不是静态属性,他没有从静态方法中访问它。
  • @drrcknlsn 您在技术上是正确的,但该页面确实告诉您有两种访问属性的方法,具体取决于它们是什么($this->self::)。我的猜测是编写文档的人都认为常量与静态属性非常相似,因此将“常量”部分留在了句子之外。
  • 请参阅类常量手册页:php.net/language.oop5.constants。对象属性页面具有误导性,实际上与常量无关。
  • @NullUserException: 访问常量时不像访问静态属性那样使用印记,因此它不仅仅是语义上的差异 - self::FOOself::$foo

标签: php class properties


【解决方案1】:

访问常量try

class A
{
    const HELLO = 'HELLO WORLD';

    public function __construct()
    {
        echo self::HELLO;
    }
}

【讨论】:

  • 我知道。我想要官方 PHP 文档中的声明解释。
  • ok:常量不依赖于实例,它们的值是“常量”,所以它们必须以静态方式调用(@​​987654321@)。 $this->varname 表示当前实例的任何可变变量。
【解决方案2】:

手册中的条目确实有点误导。我现在已经删除了对常量和方法的引用,因为无论如何它们都不属于关于属性的一章。新段落现在听起来像这样:

在类方法中,可以使用 ->(对象运算符)访问非静态属性:$this->property(其中 property 是属性的名称)。使用 ::(双冒号)访问静态属性:self::$property。有关静态和非静态属性之间差异的更多信息,请参阅Static Keyword

最多可能需要一周时间,所有镜像上都会出现更改。

感谢您指出。

【讨论】:

    【解决方案3】:

    使用self 或类名访问常量。 如果你在同一班:

    self::HELLO
    

    如果你在另一个类中使用它:

    A::HELLO 
    

    【讨论】:

    • 我知道。我想要官方 PHP 文档中的声明解释。
    • 你可以看看这里:php.net/manual/en/language.oop5.static.php 但是信息不是很好,我觉得。在官方文档上找不到更好的东西。也许你也可以看看一些书。
    【解决方案4】:

    你必须使用self::HELLO!!

    【讨论】:

      【解决方案5】:

      在类本身中,您可以像访问静态一样访问常量:self::MY_CONSTANT,在类之外,您可以使用 Class_Name::MY_CONSTANT 来引用它。当有疑问时(例如,抽象类中的示例),我喜欢使用:

      $self = get_called_class($this);
      $self::MY_CONSTANT;//gets the constant of currently called class
      

      记住这一点的简单方法:想想 PDO 查询:

      $stmt->fetch(PDO::FETCH_ASSOC);//<-- uses class constant
      

      【讨论】:

        【解决方案6】:

        PHP 手册的Class Constants 页面对此进行了最清晰的解释。在类内,您使用self::constant 访问常量,从类外您使用Classname::constant 访问它。

        对于您的示例,您将使用:-

        class A
        {
            const HELLO = 'HELLO WORLD';
        
            public function __construct()
            {
                echo self::HELLO;
            }
        }
        
        $a = new A();
        

        或者,在课堂之外:-

        echo A::HELLO;
        

        但是,我链接的手册页中的解释非常好,非常清楚。

        我应该指出,没有必要实例化类来访问其中包含的常量。以下将起作用:-

        class A
        {
            const HELLO = 'HELLO WORLD';
        }
        
        echo A::HELLO;
        

        【讨论】:

          猜你喜欢
          • 2014-02-09
          • 2013-01-25
          • 2013-04-07
          • 1970-01-01
          • 1970-01-01
          • 2013-02-17
          • 1970-01-01
          • 1970-01-01
          • 2023-03-15
          相关资源
          最近更新 更多