Создание глобальной переменной, доступной для каждой функции внутри класса
У меня есть переменная в глобальной области, которая называется ${SYSTEM}
, где SYSTEM является определенной константой. У меня есть много классов с функциями, которые должны иметь доступ к этой переменной, и я нахожу это раздражающим объявление global ${SYSTEM};
каждый раз.
Я попробовал объявить переменную класса: public ${SYSTEM} = $GLOBALS[SYSTEM];
, но это приводит к синтаксической ошибке, которая является странной, потому что у меня есть другой класс, который объявляет переменные класса таким образом и, кажется, работает нормально. Единственное, о чем я могу думать, это то, что константа не распознается.
Мне удалось выполнить это с помощью конструктора, но я ищу более простое решение, прежде чем прибегать к этому.
ИЗМЕНИТЬ
Глобальная переменная ${SYSTEM} - это массив с множеством других дочерних массивов. К сожалению, не существует способа обойти конструктор...
Ответы
Ответ 1
Хорошо, надеюсь, у меня есть суть того, чего вы пытаетесь достичь.
<?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();
?>
Ответ 2
Вот как я обращаюсь ко всему миру глобально.
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
.
Фиксированное форматирование
Ответ 3
Вы можете использовать конструктор, подобный этому:
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();
?>
Ответ 4
Прямая спецификация переменных-членов не может содержать ссылок на другие переменные (class {public $membervar = $outsidevar;}
также недействительна). Вместо этого используйте конструктор.
Однако, поскольку вы имеете дело с константой, почему бы вам не использовать php константа или константа класса?
Ответ 5
Вы пытаетесь сделать что-то действительно необычное здесь, так что вы можете ожидать, что это будет неудобно. Работа с globals никогда не бывает приятной, особенно если вы не используете динамический выбор имени, используя константу SYSTEM
. Лично я бы рекомендовал вам использовать $GLOBALS[SYSTEM]
везде, или...
$sys = $GLOBALS[SYSTEM];
... если вы собираетесь использовать его много.
Ответ 6
Вы также можете попробовать шаблон 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 для получения дополнительной информации
Ответ 7
Я бы сказал, что первые две вещи, которые выделяются для меня:
- Вам не нужны скобки вокруг имени переменной, вы можете просто сделать общедоступную $system или public $SYSTEM.
- Хотя PHP не всегда может потребовать его, стандартная практика заключается в инкапсуляции индексов нечисловых массивов в одинарные или двойные кавычки, если используемая вами строка становится константой в какой-то момент.
Это должно быть то, что вы ищете
class SomeClass {
public $system = $GLOBALS['system'];
}
Вы также можете использовать константы класса, которые вместо этого были бы
class SomeClass {
const SYSTEM = $GLOBALS['system'];
}
Это может быть указано в классе с "self:: SYSTEM" и внешне с "SomeClass:: SYSTEM".
Ответ 8
class Dateutility {
public $a,$b;
public function getCurrentTime() {
date_default_timezone_set("Asia/Karachi");
echo "The current time is: ";
echo date("g:i a");
}
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);