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