Как передать глобальные переменные классам в PHP? - PullRequest
7 голосов
/ 22 января 2011

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

пример:

$admin = "admin_area";

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

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

class Administrator{

   public function auth($pass,$user){

     global $admin;
     .....

  }
  public function logout(){
    global $admin;

    .....
}

} 

Ответы [ 5 ]

10 голосов
/ 22 января 2011

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

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

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

2 голосов
/ 22 января 2011

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

Итак, вы можете:

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

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

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

1 голос
/ 22 января 2011

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

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

1 голос
/ 22 января 2011

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

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

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

0 голосов
/ 24 июля 2018

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

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

Пример:

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