get_defined_vars()
La funzione get_defined_vars() di PHP restituisce un array associativo con tutte le variabili definite nello scope corrente.
Introduzione
get_defined_vars() è una funzione built-in di PHP che restituisce un array associativo di tutte le variabili presenti nello scope in cui viene chiamata. Le chiavi dell'array sono i nomi delle variabili (senza il $ iniziale) e i valori sono i valori correnti delle variabili.
Il concetto chiave da ricordare è lo scope. Uno "scope" è la regione del codice in cui una variabile è visibile. PHP dispone di scope di funzione (variabili all'interno di una funzione) e scope globale (variabili al livello superiore di uno script). get_defined_vars() riporta solo ciò che è visibile nel punto esatto in cui viene chiamata, il che la rende un modo rapido per acquisire un'istantanea dello stato durante il debug senza dover nominare ogni variabile manualmente.
Questa pagina tratta la sintassi, cosa la funzione fa e non fa, come il risultato cambia in base allo scope e i casi d'uso reali più comuni.
Sintassi
get_defined_vars(): arrayLa funzione non accetta nessun argomento e restituisce sempre un array. Se nello scope corrente non sono definite variabili, restituisce un array vuoto.
Esempio di base
Il caso più semplice è chiamarla nello scope globale, subito dopo aver definito alcune variabili:
<?php
$name = "Ada";
$age = 36;
$colors = ["red", "green"];
print_r(get_defined_vars());
?>Le variabili definite dall'utente compaiono come chiavi (insieme ai superglobali di PHP, spiegati di seguito):
Array
(
[name] => Ada
[age] => 36
[colors] => Array
(
[0] => red
[1] => green
)
...
)Lo scope è importante: locale vs. globale
Questo è il punto che causa confusione. get_defined_vars() non attraversa i confini dello scope. Una funzione non può vedere le variabili globali dello script a meno che non siano state importate (ad esempio con la parola chiave global o passate come argomenti), quindi chiamare get_defined_vars() all'interno di una funzione riporta solo le variabili locali di quella funzione.
All'interno della funzione, è visibile solo la variabile locale, quindi l'output è semplicemente:
Array
(
[var3] => 1
)Le variabili globali $var1 e $var2 non sono elencate, perché appartengono a uno scope diverso. (true viene stampato come 1 perché PHP in print_r rappresenta il boolean true in questo modo.)
E i superglobali?
Un malinteso comune è che get_defined_vars() restituisca sempre i superglobali ($_GET, $_POST, $_SERVER e così via). Non è così. I superglobali vengono restituiti solo quando si chiama la funzione nello scope globale, perché è lì che risiedono. All'interno di una funzione sono accessibili per nome ma non fanno parte di quello scope locale, quindi non compaiono nel risultato sopra. La stessa regola vale per $GLOBALS — non è incluso nell'array restituito.
Casi d'uso comuni
Verificare se una variabile è definita
Poiché il risultato è un semplice array, è possibile verificare l'esistenza di una variabile con array_key_exists(). Questo è utile quando una variabile potrebbe essere impostata solo su alcuni percorsi del codice:
<?php
$config = "loaded";
$vars = get_defined_vars();
var_dump(array_key_exists("config", $vars)); // bool(true)
var_dump(array_key_exists("missing", $vars)); // bool(false)
?>Per controllare una singola variabile nota, isset() è di solito più chiaro; get_defined_vars() eccelle quando si vuole avere il quadro completo in una sola volta.
Debug dello stato all'interno di una funzione
Inserire una chiamata vicino a una riga problematica per vedere ogni variabile locale e il suo valore, invece di scrivere un var_dump() per ognuna:
<?php
function calculatePrice($base, $taxRate) {
$tax = $base * $taxRate;
$total = $base + $tax;
print_r(get_defined_vars());
return $total;
}
calculatePrice(100, 0.2);
?>L'istantanea mostra gli argomenti e ogni variabile locale lungo il percorso:
Array
(
[base] => 100
[taxRate] => 0.2
[tax] => 20
[total] => 120
)Funzioni correlate
| Funzione | Usala quando vuoi… |
|---|---|
compact() | Costruire un array a partire da nomi di variabili selezionati. |
extract() | Fare l'operazione inversa — trasformare le chiavi di un array in variabili. |
isset() | Verificare se una specifica variabile è impostata e non è null. |
Vedi anche Variable scope per le regole che determinano cosa può vedere get_defined_vars(), e PHP superglobals per capire perché compaiono solo nello scope globale.
Conclusione
get_defined_vars() fornisce un'istantanea in una riga di tutte le variabili visibili nello scope corrente, rendendola un utile strumento di debug rapido e un modo semplice per ispezionare o testare lo stato a livello programmatico. L'unica regola da tenere a mente è lo scope: all'interno di una funzione si vedono solo le variabili locali di quella funzione (più tutto ciò che è stato importato esplicitamente), mentre nello scope globale si vedono anche i superglobali di PHP. Conoscere questo confine è ciò che rende la funzione prevedibile da usare.