我可以在类中设置常量然后在PHP外部访问它吗?

时间:2011-04-19 01:39:46

标签: php constants

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

<?php

class Config {

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

}

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

我可以在外面访问吗?

5 个答案:

答案 0 :(得分:7)

类常量使用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());

答案 1 :(得分:5)

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);

答案 2 :(得分:1)

不是来自原始代码。但是以下内容将作为一个常量类变量。

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

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

echo Config::TEST;

答案 3 :(得分:0)

是的 - 您可以Config::TEST

访问它

答案 4 :(得分:0)

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