Как передать глобальные переменные классам в 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();