Могу ли я установить константу в классе, а затем получить к ней доступ в PHP? - PullRequest
5 голосов
/ 19 апреля 2011

Я пытаюсь инициализировать некоторые значения внутри класса, сохранить их в константе и получить доступ к ним снаружи, в другой части моего кода.

<?php

class Config {

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

}

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

Могу ли я получить к нему доступ снаружи?

Ответы [ 5 ]

7 голосов
/ 19 апреля 2011

Константа класса использует ключевое слово 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);

Недостатком является то, что ничто не мешает другому коду установить значение вне класса.Если вам нужна защита от этого, вы должны использовать подход с функцией получения.например.

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());
5 голосов
/ 19 апреля 2011
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 мог манипулировать значением этого свойства напрямую, тогда используйте ключевое слово private или protected. Если это не проблема, вы можете использовать свойство 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);
1 голос
/ 19 апреля 2011

Не из вашего исходного кода. Но следующее будет работать как постоянная переменная класса.

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

Доступ из любого места, к которому относится объявление класса Config:

echo Config::TEST;
0 голосов
/ 19 апреля 2011

Возможно, все, что вам понадобится в этом случае, - это private переменная с getter методами или константа класса.

0 голосов
/ 19 апреля 2011

Да - вы можете получить к нему доступ Config::TEST

...