2011-01-22 26 views
6

Come posso passare le variabili globali alle classi che voglio usare senza dichiararle come GLOBAL in ogni metodo della classe?Come passare le variabili globali alle classi in PHP?

esempio:

$admin = "admin_area"; 

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

nella classe amministratore Voglio che il $ amministratore variabile sia accessibile a tutti i metodi della classe senza fare questo:

class Administrator{ 

    public function auth($pass,$user){ 

    global $admin; 
    ..... 

    } 
    public function logout(){ 
    global $admin; 

    ..... 
} 

} 
+0

memorizzarlo nella sessione –

+0

possibile duplicato di [classe PHP: variabile globale come proprietà nella classe] (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

risposta

9

Beh, è ​​possibile dichiarare una variabile membro e passarlo al costruttore:

class Administrator { 
    protected $admin = ''; 

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

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

Quindi creare un'istanza di:

$adminObject = new Administrator($admin); 

Ma suggerirei di cercare di evitare il più possibile le variabili globali. Renderanno il tuo codice molto più difficile da leggere e correggere. Facendo qualcosa come sopra (passandolo al costruttore di una classe), lo si migliora notevolmente ...

+0

posso passare un oggetto come parametro nel costruttore? –

+2

@Waseem: Sì. Puoi passare quello che vuoi ... – ircmaxell

+1

+1 per evitare i globali! – Josh

1

Copiali in variabili oggetto nel costruttore.

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

Non è troppo elegante, in ogni caso, l'utilizzo di globals non è troppo elegante.

2

In generale, PHP fornisce $GLOBAL matrice, che può essere utilizzato per accedere alle variabili superglobali. BTW, usando questa matrice non è molto meglio dell'uso della dichiarazione "globale" all'inizio di tutti i tuoi metodi. Inoltre, l'utilizzo di tale approccio non sembra essere una buona pratica per il codice orientato agli oggetti.

Quindi, è possibile:

  • o passare queste variabili come parametro del costruttore (vedi risposta da ircmaxell per i dettagli)

  • o usare qualche classe di configurazione (Singleton)

La decisione dipende dalla semantica dei parametri globali.