如何在PHP中向类传递全局变量?

10
如何将全局变量传递给我想要使用的类,而无需在类的每个方法中声明它们为全局变量?
示例:
$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;

    .....
}

} 

可能是PHP类:将全局变量作为类属性的重复问题。 - Gordon
Ad nauseam http://stackoverflow.com/search?q=access+global+in+class - Gordon
5个回答

11

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

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

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


我可以在构造函数中将一个对象作为参数传递吗? - Waseem Senjer

2

2
一般来说,PHP提供了$GLOBAL数组,可用于访问超全局变量。顺便说一下,使用这个数组并不比在所有方法的开头使用“global”语句更好。此外,使用这种方法似乎不是面向对象编程的良好实践。
因此,您可以:
  • 将这些变量作为构造函数参数传递(有关详细信息,请参见ircmaxell的答案)

  • 或使用某个配置类(单例)

决定取决于您的全局参数的语义。

1

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

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

这不太优雅,反正使用全局变量也不太优雅。


0

在我看来,实现这一点的最佳方式是使用单例模式

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

示例:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接