Создание глобальной переменной, доступной для каждой функции внутри класса

У меня есть переменная в глобальной области, которая называется ${SYSTEM} , где SYSTEM является определенной константой. У меня много классов с функциями, которые должны иметь доступ к этой переменной, и я нахожу это раздражающим объявление global ${SYSTEM}; каждый раз.

Я попытался объявить переменную класса: public ${SYSTEM} = $GLOBALS[SYSTEM]; но это приводит к синтаксической ошибке, которая является странной, потому что у меня есть другой класс, который объявляет переменные класса таким образом и, кажется, работает нормально. Единственное, о чем я могу думать, это то, что константа не распознается.

Мне удалось сделать это с помощью конструктора, но я ищу более простое решение, прежде чем прибегать к этому.


EDIT Глобальная переменная $ {SYSTEM} – это массив с множеством других дочерних массивов. К сожалению, не существует способа обойти использование конструктора …

Хорошо, надеюсь, у меня есть суть того, что вы пытаетесь достичь.

 <?php // the global array you want to access $GLOBALS['uname'] = array('kernel-name' => 'Linux', 'kernel-release' => '2.6.27-11-generic', 'machine' => 'i686'); // the defined constant used to reference the global var define(_SYSTEM_, 'uname'); class Foo { // a method where you'd liked to access the global var public function bar() { print_r($this->{_SYSTEM_}); } // the magic happens here using php5 overloading public function __get($d) { return $GLOBALS[$d]; } } $foo = new Foo; $foo->bar(); ?> 

Вот как я получаю доступ ко всему миру без глобального.

 class exampleGetInstance { private static $instance; public $value1; public $value2; private function initialize() { $this->value1 = 'test value'; $this->value2 = 'test value2'; } public function getInstance() { if (!isset(self::$instance)) { $class = __CLASS__; self::$instance = new $class(); self::$instance->initialize(); } return self::$instance; } } $myInstance = exampleGetInstance::getInstance(); echo $myInstance->value1; 

$myInstance теперь является ссылкой на экземпляр класса exampleGetInstance .

Фиксированное форматирование

Вы можете использовать такой конструктор:

 class Myclass { public $classvar; function Myclass() { $this->classvar = $GLOBALS[SYSTEM]; } } 

EDIT: Спасибо, что указали на опечатку, Питер!

Это тоже работает для массива. Если назначение нежелательно, также выполняется ссылка:

 $this->classvar =& $GLOBALS[SYSTEM]; 

EDIT2: для проверки этого метода использовался следующий код, который работал в моей системе:

 <?php define('MYCONST', 'varname'); $varname = array("This is varname", "and array?"); class Myclass { public $classvar; function Myclass() { $this->classvar =& $GLOBALS[MYCONST]; } function printvar() { echo $this->classvar[0]; echo $this->classvar[1]; } }; $myobj = new Myclass; $myobj->printvar(); ?> 

Прямая спецификация переменных-членов не может содержать ссылок на другие переменные ( class {public $membervar = $outsidevar;} недействителен). Вместо этого используйте конструктор.

Однако, поскольку вы имеете дело с константой, почему бы вам не использовать постоянные или постоянные объекты php?

Вы пытаетесь сделать что-то действительно необычное здесь, так что вы можете ожидать, что это будет неудобно. Работа с globals никогда не бывает приятной, особенно если вы не используете динамический выбор имени с использованием постоянной SYSTEM . Лично я бы рекомендовал вам использовать $GLOBALS[SYSTEM] везде или …

 $sys = $GLOBALS[SYSTEM]; 

… если вы собираетесь использовать его много.

Вы также можете попробовать шаблон singleton, хотя в какой-то степени он недоволен кругами ООП, его обычно называют глобальной переменной классов.

 <?php class Singleton { // object instance private static $instance; // The protected construct prevents instantiating the class externally. The construct can be // empty, or it can contain additional instructions... protected function __construct() { ... } // The clone and wakeup methods prevents external instantiation of copies of the Singleton class, // thus eliminating the possibility of duplicate objects. The methods can be empty, or // can contain additional code (most probably generating error messages in response // to attempts to call). public function __clone() { trigger_error('Clone is not allowed.', E_USER_ERROR); } public function __wakeup() { trigger_error('Deserializing is not allowed.', E_USER_ERROR); } //This method must be static, and must return an instance of the object if the object //does not already exist. public static function getInstance() { if (!self::$instance instanceof self) { self::$instance = new self; } return self::$instance; } //One or more public methods that grant access to the Singleton object, and its private //methods and properties via accessor methods. public function GetSystemVar() { ... } } //usage Singleton::getInstance()->GetSystemVar(); ?> 

Этот пример слегка изменен из википедии, но вы можете получить эту идею. Попробуйте выполнить поиск по шаблону Singleton для получения дополнительной информации

Я бы сказал, что первые две вещи, которые выделяются для меня:

  1. Вам не нужны скобки вокруг имени переменной, вы можете просто использовать public $ system или public $ SYSTEM.
  2. Хотя PHP не всегда может потребовать этого, стандартная практика заключается в инкапсуляции индексов нечислового массива в одиночные или двойные кавычки, если используемая вами строка становится константой в какой-то момент.

Это должно быть то, что вы ищете

 class SomeClass { public $system = $GLOBALS['system']; } 

Вы также можете использовать константы класса, которые вместо этого

 class SomeClass { const SYSTEM = $GLOBALS['system']; } 

Это можно указать в классе с «self :: SYSTEM» и внешне с «SomeClass :: SYSTEM».

 class Dateutility { public $a,$b; public function getCurrentTime() { date_default_timezone_set("Asia/Karachi"); echo "The current time is: "; echo date("g:ia"); } public function seta($c) { $a=$c; echo "<br/>value of a is:".$a; } public function setb($d) { $b=$d; echo "value of b is:".$b; } } $vari = new Dateutility; $vari->getCurrentTime(); $vari->seta(10); $vari->setb(20);