Ricerca…


introduzione

Lo scope variabile si riferisce alle regioni del codice a cui è possibile accedere a una variabile. Questo è anche indicato come visibilità . In PHP i blocchi di ambito sono definiti da funzioni, classi e un ambito globale disponibile in tutta l'applicazione.

Variabili globali definite dall'utente

L'ambito al di fuori di qualsiasi funzione o classe è l'ambito globale. Quando uno script PHP ne include un altro (usando include o require ) l'ambito rimane lo stesso. Se uno script è incluso al di fuori di qualsiasi funzione o classe, le sue variabili globali sono incluse nello stesso ambito globale, ma se uno script è incluso all'interno di una funzione, le variabili nello script incluso sono nell'ambito della funzione.

Nell'ambito di una funzione o di un metodo di classe, la parola chiave global può essere utilizzata per creare una variabile globale definita dall'utente di accesso.

<?php

$amount_of_log_calls = 0;

function log_message($message) {
    // Accessing global variable from function scope
    // requires this explicit statement
    global $amount_of_log_calls;

    // This change to the global variable is permanent
    $amount_of_log_calls += 1;

    echo $message;
}

// When in the global scope, regular global variables can be used
// without explicitly stating 'global $variable;'
echo $amount_of_log_calls; // 0

log_message("First log message!");
echo $amount_of_log_calls; // 1

log_message("Second log message!");
echo $amount_of_log_calls; // 2

Un secondo modo per accedere alle variabili dall'ambito globale consiste nell'utilizzare la speciale matrice $ GLOBALS definita da PHP.

L'array $ GLOBALS è un array associativo con il nome della variabile globale come chiave e il contenuto di tale variabile come valore dell'elemento dell'array. Nota come $ GLOBALS esiste in qualsiasi ambito, questo perché $ GLOBALS è un superglobale.

Ciò significa che la funzione log_message() potrebbe essere riscritta come:

function log_message($message) {
    // Access the global $amount_of_log_calls variable via the
    // $GLOBALS array. No need for 'global $GLOBALS;', since it
    // is a superglobal variable.
    $GLOBALS['amount_of_log_calls'] += 1;

    echo $messsage;
}

Si potrebbe chiedere, perché usare l'array $ GLOBALS quando la parola chiave global può essere utilizzata anche per ottenere il valore di una variabile globale? Il motivo principale è l'utilizzo della parola chiave global che porterà la variabile in ambito. Quindi non è possibile riutilizzare lo stesso nome di variabile nell'ambito locale.

Variabili superglobal

Le variabili superglobal sono definite da PHP e possono sempre essere utilizzate da qualsiasi luogo senza la parola chiave global .

<?php

function getPostValue($key, $default = NULL) {
    // $_POST is a superglobal and can be used without
    // having to specify 'global $_POST;'
    if (isset($_POST[$key])) {
        return $_POST[$key];
    }

    return $default;
}

// retrieves $_POST['username']
echo getPostValue('username');

// retrieves $_POST['email'] and defaults to empty string
echo getPostValue('email', '');

Proprietà statiche e variabili

Le proprietà delle classi statiche definite con la visibilità public sono funzionalmente equivalenti alle variabili globali. È possibile accedervi da qualsiasi posizione definita dalla classe.

class SomeClass {
    public static int $counter = 0;
}

// The static $counter variable can be read/written from anywhere
// and doesn't require an instantiation of the class
SomeClass::$counter += 1;

Le funzioni possono anche definire variabili statiche all'interno del proprio ambito. Queste variabili statiche persistono attraverso chiamate a funzioni multiple, diversamente dalle variabili regolari definite nell'ambito di una funzione. Questo può essere un modo molto facile e semplice per implementare il modello di progettazione Singleton:

class Singleton {
    public static function getInstance() {
        // Static variable $instance is not deleted when the function ends
        static $instance;

        // Second call to this function will not get into the if-statement,
        // Because an instance of Singleton is now stored in the $instance
        // variable and is persisted through multiple calls
        if (!$instance) {
            // First call to this function will reach this line,
            // because the $instance has only been declared, not initialized
            $instance = new Singleton();
        }

        return $instance;

    }
}

$instance1 = Singleton::getInstance();
$instance2 = Singleton::getInstance();

// Comparing objects with the '===' operator checks whether they are
// the same instance. Will print 'true', because the static $instance
// variable in the getInstance() method is persisted through multiple calls
var_dump($instance1 === $instance2);


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow