2011-01-22 18 views
6

¿Cómo puedo pasar las variables globales a las clases que quiero usar sin declararlas como GLOBAL en todos los métodos de la clase?¿Cómo pasar variables globales a clases en PHP?

ejemplo:

$admin = "admin_area"; 

if($_POST['login']){ 
     $user = new Administrator; 
     $user->auth($pass,$username); 
    } 

en el Administrador de clase quiero que el $ de administración variable de ser accesible en todos los métodos de la clase sin hacer esto:

class Administrator{ 

    public function auth($pass,$user){ 

    global $admin; 
    ..... 

    } 
    public function logout(){ 
    global $admin; 

    ..... 
} 

} 
+0

almacenarlo en la sesión –

+0

posible duplicar de [clase PHP: variable global como propiedad en la clase] (http://stackoverflow.com/questions/4489134/php-class-global-variable-as-property-in-class) – Gordon

+0

Ad nauseam http://stackoverflow.com/search?q=access+global+in+class – Gordon

Respuesta

9

Bueno, se puede declarar una variable miembro , y pasarlo al constructor:

class Administrator { 
    protected $admin = ''; 

    public function __construct($admin) { 
     $this->admin = $admin; 
    } 

    public function logout() { 
     $this->admin; //That's how you access it 
    } 
} 

Entonces instancia por:

$adminObject = new Administrator($admin); 

Pero sugiero tratar de evitar las variables globales tanto como sea posible. Harán que su código sea mucho más difícil de leer y depurar. Al hacer algo como lo anterior (pasarlo al constructor de una clase), lo mejora en gran medida ...

+0

puedo pasar un objeto como parámetro en el constructor? –

+2

@Waseem: Sí. Puedes pasar lo que quieras ... – ircmaxell

+1

+1 para evitar los globales! – Josh

1

Cópialos en variables de objeto en el constructor.

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

No es muy elegante, de todos modos, usar globals no es demasiado elegante.

2

En general, PHP proporciona $GLOBAL matriz, que se puede utilizar para acceder a las variables superglobales. Por cierto, usar esta matriz no es mucho mejor que usar una declaración "global" al principio de todos tus métodos. Además, usar dicho enfoque no parece ser una buena práctica para el código orientado a objetos.

Por lo tanto, se puede:

  • o bien pasar estas variables como parámetro de constructor (véase la respuesta de ircmaxell para más detalles)

  • o utilizar alguna clase de configuración (Singleton)

La decisión depende de la semántica de sus parámetros globales.