2011-01-09 14 views
10

Zastanawiam się, co według Ciebie byłoby najlepszym i najczystszym sposobem zdefiniowania stałej zmiennej tablicowej, podobnie jak działa funkcja zdefiniować. Widziałem wiele osób zadaje to pytanie w Google i jak dotąd najprostszym rozwiązaniem mam wymyślić jest użycie PHP serializacji funkcji wewnątrz określić oświadczenie, jak toJaki jest najbardziej "elegancki" sposób definiowania globalnej stałej tablicy w PHP

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

następnie używać zdefiniowane stałe można zrobić coś takiego:

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

Nie jestem pewien, czy serialize funkcja spowolnić, jeśli masz dużo definiuje w twoim kodzie. Co myślisz?

+1

Do czego potrzebny jest globalny var. Być może istnieje lepsze podejście. – PeeHaa

+2

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

+0

PeeHaa, potrzebowałbym go globalnie, gdybym chciał uzyskać dostęp do stałej tablicy z dowolnej klasy lub funkcji w tej samej przestrzeni nazw! – techexpert

Odpowiedz

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

Czy ktoś może przesłonić MY_ARRAY za pomocą $ _POST ["MY_ARRAY"} lub $ _GET ["MY_ARRAY"] i wprowadzić własny kod w ten sposób? – techexpert

+0

nie, dlatego stworzono superplanowe macierze. W dawnych czasach ludzie używali go w konfiguracji PHP, aby zmienne post stały się zmiennymi globalnymi, dopóki nie zorientują się, że to był hakerowski sen. aby mieć pewność, wypróbuj go na swoim serwerze testowym i zobacz, co się stanie. – dqhendricks

+0

$ GLOBALS nie jest w żaden sposób powiązany ze zmiennymi $ _POST lub $ _GET. – dqhendricks

6

Serializacja, a zwłaszcza unserialization, jest dość niezręczna. (Z drugiej strony nie jest całkiem jasne, dlaczego język skryptowy nie może mieć tablic jako stałych ...)

Ale to naprawdę zależy od wzoru użycia. Normalnie potrzebujesz globalnych definicji przechowywania ustawień konfiguracyjnych. A zmienne globalne i stałe są do tego odpowiednie (pomimo, że "globals are evil 1!" Meme). Ale to jest wskazane, aby wyrzucić wszystko do jakiegoś obiektu rejestru lub tablicy co najmniej:

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

Daje to najprostszy składni dostępu z config::$MY_ARRAY. To nie jest stałe, ale możesz je łatwo sfałszować. Wystarczy użyć ArrayObject lub ArrayAccess i zaimplementować go w taki sposób, aby atrybuty były tylko do odczytu. (. Bądź offsetSet wygeneruje błąd)

Jeśli chcesz globalnej tablicy stały obejście, potem drugi alternatywny (mam skradziony ten pomysł z define manual page) jest użycie funkcji zamiast stałej:

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

Dostęp jest znowu niezupełnie ciągły, ale MY_ARRAY() jest wystarczająco krótki. Chociaż ładny dostęp do tablicy z MY_ARRAY()["key1"] nie jest możliwy przed PHP 5.3; ale znowu można to sfałszować na przykład pod numerem MY_ARRAY("key1").

+0

Mario, co może, potencjalnie, pójść nie tak z serializacją? Ponadto ani funkcja, ani klasa nie zostaną włączone do zakresu globalnego. – techexpert

+0

@techexpert, naprawdę nie ma nic złego w serializacji. Ale "unserialise" (MY_ARRAY) "czyta się dość długo i zawsze potrzebujesz tymczasowej zmiennej do rozpakowania. Ten rodzaj pokonuje cel łatwego dostępu do stałych. Równie dobrze możesz zdefiniować funkcję 'my_const_array (" NAME ")', aby pobrać ją z rejestru. – mario

+0

Naprawdę chciałem znaleźć alternatywę dla wyrażenia "define" dla tablic, więc możesz przekazać zmienną do dowolnej funkcji w czysty sposób, na przykład: call_function (MY_ARRAY) – techexpert

Powiązane problemy