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

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

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

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


ОТРЕДАКТИРУЙТЕ глобальный $ {СИСТЕМА}, переменная является массивом с большим количеством других дочерних массивов в нем. К сожалению, кажется, нет способа обойти использование конструктора...

13
задан Lightness Races with Monica 24 July 2011 в 19:17
поделиться

7 ответов

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

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

?>
8
ответ дан 1 December 2019 в 23:49
поделиться

Это - то, как я получаю доступ к вещам глобально без глобального.

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 класс.

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

8
ответ дан 1 December 2019 в 23:49
поделиться

Вы могли использовать конструктора как это:

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

Править: Спасибо за указание на опечатку, Peter!

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

$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();
?>
2
ответ дан 1 December 2019 в 23:49
поделиться

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

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

1
ответ дан 1 December 2019 в 23:49
поделиться

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

$sys = $GLOBALS[SYSTEM];

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

1
ответ дан 1 December 2019 в 23:49
поделиться

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

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

?>

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

-1
ответ дан 1 December 2019 в 23:49
поделиться

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

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

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

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

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

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

На это можно сослаться в классе с 'сам:: СИСТЕМА' и внешне с 'SomeClass:: СИСТЕМА'.

-2
ответ дан 1 December 2019 в 23:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: