如何将全局变量传递给PHP中的类?

时间:2011-01-22 13:51:43

标签: php oop global-variables

如何将全局变量传递给我想要使用的类,而不在类的每个方法中将它们声明为GLOBAL?

示例:

$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 个答案:

答案 0 :(得分:10)

好吧,您可以声明一个成员变量,并将其传递给构造函数:

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

但我建议尽可能避免全局变量。它们将使您的代码更难以阅读和调试。通过执行类似上面的操作(将其传递给类的构造函数),您可以大大改进它......

答案 1 :(得分:2)

通常,PHP提供$GLOBAL数组,可用于访问超全局变量。顺便说一句,使用这个数组并不比在所有方法的开头使用“全局”语句好多少。此外,使用这种方法似乎不是面向对象代码的好习惯。

所以,你可以:

  • 将这些变量作为构造函数参数传递(详情请参阅ircmaxell的回答)

  • 或使用一些配置类(单例)

决策取决于全局参数的语义。

答案 2 :(得分:1)

将它们复制到构造函数中的对象变量中。

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

它不太优雅,无论如何,使用全局变量并不太优雅。

答案 3 :(得分:1)

尝试将要作为全局的变量作为参数传递给对象,然后使用__constructor()方法使其成为类属性。

您可以在此处找到更多信息和示例: In php when initializing a class how would one pass a variable to that class to be used in its functions?

答案 4 :(得分:0)

我认为,实现此目标的最佳方法是singleton

单例是一个具有静态属性和静态方法的类,您将使用该方法从任何地方调用对象,因为在代码中的任何地方都可以调用静态方法。

示例:

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