Il titolo credo sia un po ambizioso per questa pillola, ma poi capirete perché ho dato questo titolo
Non vi è mai capitato di dover impostare delle variabili in una funzione e poi doverle richiamare in un'altra funzione? Vi è mai capitato di dover passare delle variabili ad un metodo della vostra classe? E magari questa classe richiamava un'altra classe a cui doveva passare questa variabile solo in certi casi? A me si!
Se gli si passa sempre si rischia un consumo di memoria e di cicli di processore necessari per eseguire controlli che si riveleranno inutili dopo che leggerete questa mini pillola!
Seguendo le indicazioni di questa mini-pillola sarete in grado di poter richiamare qualsiasi variabile in qualsiasi punto del vostro script senza aver bisogno di usare global, passarlo come parametro o altro ancora di complesso!
Proprio cosi! Mi sono trovato nella situazione di dover passare delle variabili ad una funzione, e questa funzione richiamava un'altra funzione. Quest'ultima funzione a volte ha bisogno di questo parametro altre volte no, cosi perché passare dei parametri opzionali e fare altri ghirigori e controlli inutili?
Ecco la soluzione...l'array $GLOBALS!
In quest'array il PHP, in automatico, imposta per RIFERIMENTO tutte le variabili create nella struttura principale del programma, inoltre questa variabile è SUPERGLOBALE, ovvero disponibile in qualsiasi parte di codice, funzione o metodo che sia! Questo comporta che sfruttando quest'array e le sue proprietà è possibile creare vere e proprie variabili SUPERGLOBALI!
Provate questo codice:
codice:
<?php
$test_var = "Contenuto Test";
echo "{$test_var}
";
echo "
";
echo "{$GLOBALS['test_var']}
";
?>
Verrà fuori un risultato perfettamente identico!
Prima printiamo il contenuto della variabile e poi printiamo il riferimento nell'array $GLOBALS a quella variabile. Essendo per riferimento il risultato sarà sempre uguale anche se cambia il contenuto della variabile $test_var
Adesso provate
codice:
<?php
function test_func() {
$test_var = "Contenuto Test";
echo "\$test_var: {$test_var}
";
}
test_func();
echo "\$test_var: {$test_var}
";
echo "
";
echo "\$GLOBALS['test_var']: {$GLOBALS['test_var']}
";
?>
Qui potrete vedere che PHP non inserisce le variabili create nelle funzioni e classi nell'array $GLOBLAS ma soltanto quelle create nella struttura principale della pagina.
Infatti eseguendo l'echo $GLOBALS['test_var'] della nostra variabile dentro l'array $GLOBALS cedremo che non printa nulla.
Allora una domanda sorge spontanea: come possiamo sfruttare l'array $GLOBALS al nostro scopo?
...
cosi!
Provate questa funzione
codice:
<?php
function test_func() {
$test_var = "Contenuto Test";
echo "\$test_var: {$test_var}
";
$GLOBALS['test_var'] = &$test_var;
}
test_func();
echo "\$test_var: {$test_var}
";
echo "
";
echo "\$GLOBALS['test_var']: {$GLOBALS['test_var']}
";
?>
Qui vedrete che tutti gli echo restituiranno lo stesso contenuto!
Cosa abbiamo fatto?
Abbiamo inserito per RIFERIMENTO all'interno dell'array $GLOBALS la nostra variabile! Adesso sfruttando $GLOBALS['test_var'] potremo richiamarla in qualsiasi punto dello script.
Inoltre questo sistema non consuma memoria, soltanto quella necessaria per creare una chiave in un'array, ovvero quasi nulla. La variabile viene impostata per RIFERIMENTO e di conseguenza il contenuto stesso della variabile non viene clonato!
Per rendere il codice più comprensibile si può utilizzare questo sistema:
codice:
<?php
// Funzione per inizializzare il nostro contenitore delle variabili superglobali
function __init_global_var() {
// Inizializza l'array 'private' all'interno della variabile superglobale
$GLOBALS['private'] = array();
// Ritorna SUCCESSO
return TRUE;
}
// Setta la variabile
function __set_global_var($key, &$value) {
// Imposta la variabile
$GLOBALS['private'][$key] = &$value;
// Ritorna SUCCESSO
return TRUE;
}
// Legge la variabile
function __get_global_var($key) {
// Controlla se la variabile è stata settata
if (isset($GLOBALS['private'][$key])) {
// Ritorna il contenuto della variabile se settato
return $GLOBALS['private'][$key];
} else {
// Ritorna Fallimento se la variabile non è settata
return FALSE;
}
}
// Termina il sistema di variabili globali
function __terminate_global_var() {
// Distrugge il nostro l'array liberando la memoria
unset($GLOBALS['private']);
// Ritorna SUCCESSO
return TRUE;
}
?>
Questo codice vi permetterà di creare le vostre variabili superglobali senza alcuna difficoltà e con comodità!
Le funzioni INIT e TERMINATE non sono necessarie ma evitano i E_NOTICE, quindi se vi interessa una programmazione ben strutturata e molto comprensibile usateli
E' possibile anche creare una classe con poche modifiche!
Un esempio può essere:
codice:
<?php
// Include il file delle funzioni
require_once('globals_managment.inc.php');
// Funzione di test
function test_func() {
// Imposta una variabile
__set_global_var('test', 'Contenuto Test');
}
// Inizializza il nostro array
__init_global_var();
// Richiama la funzione
test_func();
// Printa il contenuto della nostra variabile superglobale
echo __get_global_var('test');
// Termina il sistema svuotando l'array
__terminate_global_var();
?>
Effettivamente usando questo non avrete necessità di usare la funzione globals o di ritrovarvi con funzioni che prendono 10 parametri di cui la metà non ha necessità di essere passato per riferimento
Bhe ho finito la mia mini pillola, spero che vi possa aiutare, a me ha aiutato tantissimo
ciaooooo
------
PS:
se trovate ORRORI di ortografia...o frasi che vi sembrano sconnesse...vi chiedo pardon pietà...con l'italiano nn ci vado d'accordo...in caso avvertite che correggo :PPP (già fatto, almeno per alcuni - gm)