PHP Migliori pratiche variabili globali


Esempio

Possiamo illustrare questo problema con il seguente pseudo-codice

function foo() {
    global $bob;
    $bob->doSomething();
}

La tua prima domanda qui è ovvia

Da dove viene $bob ?

Sei confuso? Buono. Hai appena saputo perché i globali sono confusi e considerati una cattiva pratica .

Se questo fosse un vero programma, il tuo prossimo divertimento sarà quello di rintracciare tutte le istanze di $bob e spero che tu trovi quella giusta (questo peggiora se $bob è usato ovunque). Peggio ancora, se qualcun altro va e definisce $bob (o hai dimenticato e riutilizzato quella variabile) il tuo codice può rompersi (nell'esempio di codice precedente, avere l'oggetto sbagliato, o nessun oggetto, causerebbe un errore fatale).

Poiché praticamente tutti i programmi PHP utilizzano il codice come include('file.php'); il tuo lavoro di mantenimento del codice come questo diventa esponenzialmente più difficile più file aggiungi.

Inoltre, questo rende molto difficile il compito di testare le tue applicazioni. Supponiamo di utilizzare una variabile globale per mantenere la connessione al database:

$dbConnector = new DBConnector(...);

function doSomething() {
    global $dbConnector;
    $dbConnector->execute("...");
}

Per testare questa funzione, è necessario sovrascrivere la variabile globale $dbConnector , eseguire i test e quindi reimpostarla sul valore originale, che è molto incline ai bug:

/**
 * @test
 */
function testSomething() {
     global $dbConnector;

     $bkp = $dbConnector; // Make backup
     $dbConnector = Mock::create('DBConnector'); // Override

     assertTrue(foo());

     $dbConnector = $bkp; // Restore
}

Come evitiamo i Globali?

Il modo migliore per evitare i globals è una filosofia chiamata Dependency Injection . Qui è dove passiamo gli strumenti di cui abbiamo bisogno nella funzione o classe.

function foo(\Bar $bob) {
    $bob->doSomething();
}

Questo è molto più facile da capire e mantenere. Non si può pensare a dove $bob stato impostato perché il chiamante è responsabile per sapere che (ci sta passando quello che dobbiamo sapere). Ancora meglio, possiamo usare le dichiarazioni di tipo per limitare ciò che viene passato.

Quindi sappiamo che $bob è un'istanza della classe Bar o un'istanza di un figlio di Bar , il che significa che sappiamo che possiamo usare i metodi di quella classe. Combinato con un autoloader standard (disponibile da PHP 5.3), ora possiamo rintracciare dove viene definita la Bar . PHP 7.0 o versioni successive include dichiarazioni di tipo espanso, in cui è anche possibile utilizzare i tipi scalari (come int o string ).

4.1

Variabili superglobal

Super globals in PHP sono variabili predefinite, che sono sempre disponibili, accessibili da qualsiasi ambito in tutto lo script.

Non è necessario fare una variabile $ globale; per accedervi all'interno di funzioni / metodi, classi o file.

Queste variabili superglobali di PHP sono elencate di seguito: