【问题标题】:How to pass Global variables to classes in PHP?如何将全局变量传递给 PHP 中的类?
【发布时间】:2011-06-13 16:22:42
【问题描述】:

如何将全局变量传递给我想使用的类而不在类的每个方法中将它们声明为 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;

    .....
}

} 

【问题讨论】:

标签: php oop global-variables


【解决方案1】:

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

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】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      所以,你可以:

      • 要么将这些变量作为构造函数参数传递(有关详细信息,请参阅 ircmaxell 的答案)

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

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

      【讨论】:

        【解决方案5】:

        在我看来,实现这一目标的最佳方式是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();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-05-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多