【问题标题】:Can I set a constant in a class then access it outside in PHP?我可以在一个类中设置一个常量,然后在 PHP 外部访问它吗?
【发布时间】:2011-04-19 01:39:45
【问题描述】:

我正在尝试在一个类中初始化一些值并将它们保存在常量中,然后在我的代码的不同部分在外部访问它们。

<?php

class Config {

  public static function initialize() {
    define('TEST',"This is a Constant");
  }

}

$config = Config::initialize();
// do something with the constants

我可以在外面访问吗?

【问题讨论】:

  • 是的,我想使用不同的设置进行初始化,并通过这个静态函数在外部访问它们
  • 您的代码将定义一个全局常量。 Class::constants 是一种解析时语法结构,以后无法定义。

标签: php constants


【解决方案1】:

Class 常量使用const 关键字。您不使用 define 函数定义它们。就像这样:

class Config {
        const TEST = "This is a constant";
}

// then use it:
var_dump(Config::TEST);

在 PHP 中,您不能动态设置常量的值,但您可以使用公共静态变量获得类似的行为。即。

class Config2 {
    public static $test = null;
    public static function initialize()
    {
        self::$test = "This is not a constant";
    }
}

// Then use like
Config2::initialize();
var_dump(Config2::$test);

缺点是,没有什么可以阻止其他代码从类外部设置值。如果您需要对此进行保护,则应使用 getter 函数方法。例如。

class Config3 {
    private static $_test = null;
    public static function initialize()
    {
        self::$_test = "This is not a constant, but can't be changed outside this class";
    }

    public static function getTest()
    {
        return self::$_test;
    }
}

// Then use like
Config3::initialize();
var_dump(Config3::getTest());

【讨论】:

  • CONSTANT的内容是动态的,所以不能这样定义
  • 您不能动态设置常量(AFAIK),我添加了一些替代选项。
  • @Ibu Brenton Alker 是对的。常量不能动态设置。这是所有编程语言的默认行为。你想要的是一个只读的静态类变量,它不是没有设置器的私有静态变量,所以它只能由构造函数初始化。
  • 是的@AlexanderBehling,我一直在寻找私有静态。虽然,这个问题已有 10 年的历史了。在此过程中我学到了一两件事。
  • 对我来说也是如此。随着 PHP 的发展,继续按照我在 2002 年学习的方式进行编程将是荒谬的。当时很多有用的命令都不存在,所以无论如何你必须使用许多技巧才能使代码正常工作。就个人而言,我喜欢 PHP 8 发布线现在提供了更多 OOP 功能这一事实。从 PHP 5 开始,我尽可能将我的编程风格改为 OOP。我很好奇未来几年会发生什么。
【解决方案2】:
class Config {
  const TEST = "This is a Constant";

  static public $test = "This is a static property test."
  static protected $test2;

  public static function initialize() {
      self::$test2 = 'initialized';
      return self::$test2;
  }

  public static function getTest2()
  {
      return self::$test2;
  }
}

echo Config::TEST; // outputs This is a Constant
echo Config::$test; // outputs This is a static property test.
echo Config::initialize(); // outputs initialized;
echo Config::getTest2(); // outputs initialized;

如果您需要动态设置值,那么您不想使用常量,而是要使用静态属性。如果您只希望 Config 类能够直接操作此属性的值,则使用 privateprotected 关键字。如果那不是问题,那么您可以使用public 属性。

根据您要实现的内容,另一种可能是最可靠的方法是使用常量来访问类的静态或实例特定属性:

class Config
{
  const TEST = 0;
  const TEST2 = 1;

  protected static $conf = array();

  public static function initialize($testVal, $test2Val)
  {
    $conf[self::TEST] = $testVal;
    $conf[self::TEST2] = $test2Val;
  }

  public static function get($key)
  {
     if(isset(self::$conf[$key])
     {
       return self::$conf[$key];
     }
  }
}

Config::initialize('Test', 'Test 2');
echo Config::get(Config::TEST);
echo Config::get(Config::TEST2);

【讨论】:

    【解决方案3】:

    不是来自您的原始代码。但以下内容可以作为常量类变量。

    class Config {
        const TEST = "This is a Class Constant";
    ...
    }
    

    从包含Config 类声明的任何地方访问,例如:

    echo Config::TEST;
    

    【讨论】:

      【解决方案4】:

      是的 - 您可以通过 Config::TEST 访问它

      【讨论】:

      • 这不是访问class常量的方法吗? sn-p 中的那个不是类常量。
      • 是的,你是对的 - 定义的值不能动态设置,所以将它们放在函数中确实没有意义。
      【解决方案5】:

      在这种情况下,您可能只需要一个带有 getter 方法或类常量的 private 变量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多