2012-11-09 15 views
10

Ich erstelle ein grundlegendes Framework in PHP. Ich muss Daten für die aktuelle Seite in verschiedene Funktionen übergeben, sie ändern und speichern lassen und sie dann an die anzuzeigende Seite zurückgeben. Ich plane ursprünglich, die Daten in einer globalen Variablen wie $GLOBALS['data'] zu speichern, aber ich fange an zu denken, dass die Verwendung eines globalen eine schlechte Idee ist. Also ich denke, dass ich stattdessen eine statische Variable in der Systemklasse setzen und mit system::$data darauf zugreifen. Meine Frage ist also, welche wäre besser und warum?Globale vs statische Variablen in PHP

Dies:

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

Oder diese:

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']; 

Antwort

11

Es gibt wirklich keinen Unterschied zwischen einer globalen Variablen und einer public static variabel. Die Klassenvariable ist ein wenig besser benannt, aber das macht kaum einen Unterschied. Beide sind jederzeit und überall zugänglich und beide sind globaler Status.

Wie es passiert, ich schrieb gerade einen erschöpfenden Artikel zu diesem Thema:
How Not To Kill Your Testability Using Statics

+4

fantastischer Artikel –

+0

Gibt es einen Leistungsunterschied? Es scheint, dass Globals nicht so effizient sind wie eine statische Variable. –

+2

@Kyle ** Es ist egal. ** Ernsthaft. Es ist wahrscheinlich ein Unterschied, aber es ist so astronomisch klein, um irrelevant zu sein. Ihre oberste Priorität sollte es sein, Code zu schreiben, der wartbar, logisch, lesbar und all die anderen Dinge sein sollte. Globals und 'public static'-Variablen sind für diesen Zweck beide schrecklich. – deceze

1

Also, meine Frage ist, was besser wäre, und warum?

Sie spüren bereits, dass es ein Problem gibt, das alles in globals zu setzen. Obwohl Sie einige Gedanken entwickelt haben, um Dinge in eine Klasse zu kapseln.

Ich denke, das ist ein guter Ausgangspunkt. Lassen Sie uns etwas mehr Würze zum Kochen fügen Sie diese fließender am Anfang zu bekommen:

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

Sie haben ein Objekt erstellt jetzt, dass Sie Ihre Daten zusammen enthalten, passieren kann. Pass einfach $data an die Stelle, wo es gebraucht wird. Keine globale oder globale statische Variable benötigt.

Sie können diesen Typ sogar konkreter machen, indem Sie von ArrayObject mit Ihrem eigenen Typ erweitern.

+0

Als eine FYI, die völlig unabhängig von diesem Beitrag ist, können wir Fragen, die älter als 60 Tage sind, nicht mehr migrieren. – NullUserException

+0

@NullUserException: Danke für die Nachricht. – hakre