2012-11-09 17 views
10

Sto creando un framework di base in PHP. Devo passare i dati per la pagina corrente in diverse funzioni, consentire loro di modificarli e salvarli, e quindi passarli nuovamente alla pagina da visualizzare. Inizialmente pensavo di archiviare i dati in una variabile globale come $GLOBALS['data'], ma sto iniziando a pensare che l'utilizzo di una soluzione globale sia una cattiva idea. Quindi sto pensando che invece inserirò una variabile statica nella classe di sistema, e accederai usando system::$data. Quindi, la mia domanda è, quale sarebbe meglio e perché?Variabili globali vs statiche in PHP

questo:

$GLOBALS['data'] = array(); 
$GLOBALS['data']['page_title'] = 'Home'; 
echo $GLOBALS['data']['page_title']; 

O questo:

class system 
{ 
    public static $data = array() 
} 

function data($new_var) 
{ 
    system::$data = array_merge(system::$data, $new_var); 
} 

data(array('page_title' => 'Home')); 
echo system::$data['page_title']; 

risposta

11

Non c'è davvero nessuna differenza tra una variabile globale e una variabile public static. La variabile di classe è un namespace un po 'migliore, ma questo non fa alcuna differenza. Entrambi sono accessibili ovunque e in qualsiasi momento ed entrambi sono di stato globale.

Si dà il caso, ho appena scritto un articolo esaustivo sul tema:
How Not To Kill Your Testability Using Statics

+4

articolo impressionante –

+0

Esiste una differenza di prestazioni? Sembra che i globali non siano efficienti come usare una variabile statica. –

+2

@Kyle ** Non importa. ** Davvero. Probabilmente c'è una differenza, ma è così astronomicamente piccola da essere irrilevante. La tua priorità principale dovrebbe essere scrivere codice che sia gestibile, logico, leggibile e che tutte le altre cose debbano essere il codice delle cose. Le variabili globali e 'public static' sono entrambe terribili per questo scopo. – deceze

1

Quindi, la mia domanda è, che sarebbe meglio e perché?

Hai già la sensazione che ci sia qualche problema a mettere tutto questo in globali. Sebbene tu abbia sviluppato alcuni pensieri per incapsulare le cose in una classe.

Penso che sia un buon punto di partenza. Aggiungiamo un po 'di spezie per la cottura per ottenere questo più fluido all'inizio:

$data = new ArrayObject(array()); 
$data['page_title'] = 'Home'; 

È stato creato un oggetto ora che si può passare lungo che contiene i dati. Basta passare $data nell'area in cui è necessario. Nessuna variabile statica globale o globale necessaria.

È possibile persino rendere questo tipo più concreto in seguito estendendo da ArrayObject con il proprio tipo.

+0

Come una FYI, totalmente estranea a questo post, non possiamo più migrare le domande più vecchie di 60 giorni. – NullUserException

+0

@NullUserException: Grazie per l'avviso. – hakre