Я пытаюсь инициализировать некоторые значения внутри класса и сохранять их в константе и получать доступ к ним за пределами, в другой части моего кода.
<?php class Config { public static function initialize() { define('TEST',"This is a Constant"); } } $config = Config::initialize(); // do something with the constants
Могу ли я получить доступ к нему за пределами?
Константа класса использует ключевое слово const
. Вы не определяете их с помощью функции определения. Именно так:
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());
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);
Не из исходного кода. Но следующее будет работать как постоянная переменная класса.
class Config { const TEST = "This is a Class Constant"; ... }
Доступ из любого места, включая декларацию класса Config
например:
echo Config::TEST;
Да – вы можете получить к нему доступ как Config::TEST
Возможно, все, что вам понадобится в этом случае, является private
переменной с методами getter или константой класса.