Как передать глобальные переменные классам в PHP?

Как передать глобальные переменные классам, которые я хочу использовать, не объявляя их глобальными в каждом методе класса ?

пример :

$admin = "admin_area";

if($_POST['login']){
      $user = new Administrator;
      $user->auth($pass,$username);
    }

в Администраторе класса я хочу, чтобы переменная $admin была доступна во всех методах класса без этого:

class Administrator{

   public function auth($pass,$user){

     global $admin;
     .....

  }
  public function logout(){
    global $admin;

    .....
}

} 

5 ответов


Ну, вы можете объявить переменную-член и передать ее конструктору:

class Administrator {
    protected $admin = '';

    public function __construct($admin) {
        $this->admin = $admin;
    }

    public function logout() {
        $this->admin; //That's how you access it
    }
}

затем создайте экземпляр:

$adminObject = new Administrator($admin);

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


Как правило, PHP предоставляет $GLOBAL массив, который можно использовать для доступа к суперглобальным переменным. Кстати, использование этого массива не намного лучше, чем использование "глобального" оператора в начале всех ваших методов. Кроме того, использование такого подхода не представляется хорошей практикой объектно-ориентированного кода.

вы можете:

  • либо передайте эти переменные как параметр конструктора (см. ответ от ircmaxell для подробности)

  • или используйте некоторый класс конфигурации (singleton)

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


скопировать их в переменные объекта в конструкторе.

 global $user;
 $this->user = $user;

это не слишком элегантно, в любом случае, использование глобалов не слишком элегантно.


попробуйте передать переменную, которая должна быть глобальной для объекта в качестве аргумента, а затем использовать метод _ _ constructor (), чтобы сделать ее свойством класса.

вы можете найти больше информации и примеров здесь: в php при инициализации класса как передать переменную этому классу для использования в его функциях?


лучший способ достичь этого -синглтон, на мой взгляд.

синглтон-это класс со статическим свойством и статическим методом, который вы будете использовать для вызова объекта отовсюду, потому что статические методы могут быть вызваны везде в коде.

пример:

class Singleton 
{
   private static $instance = null;

   private function __construct()
   {
     //...whatever...
   }

   private function __clone()
   {
     throw new Exception('Not clonable..');
   }

   public static function getInstance()
   {
      if (static::$instance === null) {
         static::$instance = new Singleton();
      }
      return static::$instance;
   }
}

теперь, чтобы вызвать его оттуда, где вы хотите, вы можете использовать:

$instance = Singleton::getInstance();