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


Can I set a constant in a class then access it outside in PHP?

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

<?php
class Config {
  public static function initialize() {
    define('TEST',"This is a Constant");
  }
}
$config = Config::initialize();
// do something with the constants

我可以在外面使用吗?

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

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

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

从包括Config类声明的任何位置访问,如:

echo Config::TEST;

是-您可以将其作为Config::TEST 访问

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