2011-01-09 5 views
10

zu definieren Ich fragte mich, was wäre Ihrer Meinung nach der beste und sauberste Weg, um eine konstante Array-Variable ähnlich wie define definieren Funktion funktioniert. Ich habe viele Leute diese Frage in Google gesehen und so weit die einfachste Lösung, die ich mit oben kommen müssen, ist die PHP serialize Funktion innerhalb der definieren Anweisung zu verwenden, wie dieseWas ist die "eleganteste" Art und Weise eine globale Konstante Array in PHP

define ("MY_ARRAY", serialize (array ("key1" => $value1,"key2" => $value2, ..))); 

dann die definierte konstante zu verwenden, können Sie etwas tun:

$MY_ARRAY = unserialize (MY_ARRAY) 
print_r ($MY_ARRAY); 

nicht sicher, ob die serialize Funktion Sie verlangsamen, wenn Sie eine Menge definiert haben in deinem Code. Was denken Sie?

+1

Wofür benötigen Sie die globale Var? Vielleicht gibt es einen besseren Ansatz. – PeeHaa

+2

$ GLOBALS ['MY_ARRAY'] = array(); – dqhendricks

+0

PeeHaa, Ich würde es global benötigen, wenn ich auf das konstante Array innerhalb einer Klasse oder Funktion im selben Namespace zugreifen möchte! – techexpert

Antwort

6
$GLOBALS['MY_ARRAY'] = array(); 
+0

Kann jemand MY_ARRAY mit $ _POST ["MY_ARRAY"} oder $ _GET ["MY_ARRAY"] überschreiben und seinen eigenen Code auf diese Weise einfügen? – techexpert

+0

nein, deshalb wurden die super globalen Arrays erfunden. Früher verwendeten die Leute sie in der PHP-Konfiguration, so dass Post-Variablen zu globalen Variablen wurden, bis sie realisierten, dass dies ein Hacker-Traum war. Testen Sie es auf Ihrem Testserver und sehen Sie, was passiert. – dqhendricks

+0

$ GLOBALS steht in keiner Weise mit den Variablen $ _POST oder $ _GET in Beziehung. – dqhendricks

6

Die Serialisierung und insbesondere die Deserialisierung ist ziemlich umständlich. (Auf der anderen Seite ist es nicht ganz klar, warum eine Skriptsprache Arrays nicht als Konstanten haben kann ...)

Aber es hängt wirklich vom Verwendungsmuster ab. Normalerweise möchten Sie globale Definitionen zum Speichern von Konfigurationseinstellungen. Und globale Variablen und Konstante sind dafür geeignet (trotz der "Globals sind böse !! 1!" Meme). Aber es ist ratsam, alles in eine Art von Registry-Objekt oder Array zumindest zu werfen:

class config { 
    var $MY_ARRAY = array("key1"=>...); 
    var $data_dir = "/tmp/"; 
} 

Dies gibt die einfachstene Zugang Syntax mit config::$MY_ARRAY. Das ist keine Konstante, aber Sie können es leicht fälschen. Verwenden Sie einfach ein ArrayObject oder ArrayAccess und implementieren Sie es so, dass die Attribute schreibgeschützt sind. (. Machen offsetSet einen Fehler melden)

Wenn Sie eine globale Array-Konstante Abhilfe wollen, dann eine weitere Alternative (ich diese Idee von der define manual page gestohlen haben) ist eine Funktion anstelle einer Konstante zu verwenden:

function MY_ARRAY() { 
    return array("key1" => $value1,); 
} 

Der Zugriff ist wieder nicht ganz konstant, aber MY_ARRAY() ist kurz genug. Obwohl der Zugriff auf das Array mit MY_ARRAY()["key1"] vor PHP 5.3 nicht möglich ist; aber wieder könnte dies zum Beispiel mit MY_ARRAY("key1") gefälscht werden.

+0

Mario, was kann möglicherweise mit der Serialisierung falsch gehen? Außerdem würde weder die Funktion noch die Klasse in den globalen Geltungsbereich fallen. – techexpert

+0

@techexpert, es ist wirklich nichts falsch mit der Serialisierung. Aber 'unserialize (MY_ARRAY)' liest sich ziemlich lang, und Sie brauchen immer eine temporäre Variable zum Entpacken. Diese Art vereitelt den Zweck von leicht zugänglichen Konstanten. Sie können auch eine Funktion 'my_const_array (" NAME ") definieren, um sie aus einer Registry zu holen. – mario

+0

Ich wollte wirklich eine Alternative zur "define" -Anweisung für Arrays finden, so dass Sie die Variable auf eine saubere Weise an jede Funktion übergeben können, wie: call_function (MY_ARRAY) – techexpert

Verwandte Themen