【问题标题】:PHP Class Constants - Public, Private or Protected?PHP 类常量——公共的、私有的还是受保护的?
【发布时间】:2011-05-29 03:45:49
【问题描述】:

假设 const 属性自动公开,我是否正确?有没有办法将它们设为私有或受保护?

提前致谢。

【问题讨论】:

  • 隐藏它们的原因是什么?即使它们是公开的 - 它们也是只读的。
  • 常量是公开的,因为它们描述的是关于类的不可变事实,而不是状态或它。所以隐藏它们没有任何价值。
  • 可能会在未来的版本中使用__getStatic 伪造它们。一般来说,在脚本语言中是否需要访问修饰符是值得怀疑的。 (Javascript/Python 更加面向对象,不需要它们。)
  • 我认为这根本不是一个愚蠢的问题;私有类常量很有用:对于类中的内部使用......公共方法可以使用它们,但外部代码不应该依赖它们......API可能会改变。
  • 好吧,如果你想创建一个数据库类,将主机、用户名、服务器、数据库声明为私有常量是有意义的吗?

标签: php constants


【解决方案1】:

从历史上看,只要类被加载并且无法更改,类常量总是可以公开访问的。

从 PHP 7.1 开始,它们默认保持公开,但 access modifiers may now be applied。以下是发行说明中的​​示例:

<?php
class ConstDemo
{
    const PUBLIC_CONST_A = 1;
    public const PUBLIC_CONST_B = 2;
    protected const PROTECTED_CONST = 3;
    private const PRIVATE_CONST = 4;
}

【讨论】:

    【解决方案2】:

    php7.1 开始,您可以使用 访问修饰符publicprivateprotected)定义您的类常量。看看下面的例子:

    <?php
    class superheroes{
        public const kal_el = 'Superman';
        protected const bruce_wayne = 'Batman'; # works php7.1 onwards
        private const anthony_stark = 'Iron Man'; # works php7.1 onwards
    
        public static function show_remaining(){
            echo self::bruce_wayne, '<br />';
            echo self::anthony_stark, '<br />';
        }
    }
    echo superheroes::kal_el, '<br />';
    superheroes::show_remaining();
    

    致谢:http://dwellupper.io/post/48/defining-class-constants-in-php

    【讨论】:

      【解决方案3】:

      我知道这个问题已经 6 岁了

      Php 7.1(目前为 RC1)允许指定类常量的可见性。

      class Token {
              // Constants default to public
              const PUBLIC_CONST = 0;
      
              // Constants then also can have a defined visibility
              private const PRIVATE_CONST = 0;
              protected const PROTECTED_CONST = 0;
              public const PUBLIC_CONST_TWO = 0;
      
              //Constants can only have one visibility declaration list
              private const FOO = 1, BAR = 2;
      }
      

      其他信息

      【讨论】:

        【解决方案4】:

        类常量应该有私有/受保护的选项,因为公开会暴露类的内部细节,其他类/代码可能会误以为它们可以使用,因为它们是公共的。

        很高兴知道更改私有常量只会影响定义它的类。不幸的是,我们没有这个选项。

        记得回到你学习对象设计和分析的时候……你给类方法和属性尽可能多的限制性访问,然后根据需要放松它们(因为其他类/代码开始了,所以很难回到其他方式使用它们会破坏其他代码)。

        解决方法

        最好的办法是只创建一个私有或受保护的变量并将其大写以显示它是一个常量。您始终可以创建一个名为 constant($value_to_be_constant) 的类,该类实现正确的魔术方法/ spl 接口以防止其被更改。

        【讨论】:

          猜你喜欢
          • 2013-08-14
          • 1970-01-01
          • 2023-04-08
          • 2012-09-09
          • 2013-06-24
          • 2011-10-11
          • 1970-01-01
          • 2017-12-19
          • 1970-01-01
          相关资源
          最近更新 更多