2011-01-09 21 views
10

Mi chiedevo quale sarebbe il modo migliore e più pulito per definire una variabile di array costante simile al modo in cui la funzione definisce la funzione. Ho visto un sacco di gente che chiede a questa domanda in Google e finora la soluzione più semplice che ho venire in mente è di utilizzare il PHP serializzare funzione all'interno della definire dichiarazione, come questoQual è il modo più "elegante" per definire un array costante globale in PHP

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

poi di utilizzare la costante definita si può fare qualcosa di simile:

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

Non sono sicuro se la funzione Serialize vi rallenterà se si hanno un sacco di definisce nel tuo codice. Cosa ne pensi?

+1

A cosa serve la variante globale. Forse c'è un approccio migliore. – PeeHaa

+2

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

+0

PeeHaa, avrei bisogno che fosse globale se volessi accedere alla matrice costante da qualsiasi classe o funzione nello stesso spazio dei nomi! – techexpert

risposta

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

Qualcuno può sovrascrivere MY_ARRAY con $ _POST ["MY_ARRAY"} o $ _GET ["MY_ARRAY"] e immettere il proprio codice in questo modo? – techexpert

+0

no, ecco perché sono stati inventati gli array super globali. nei tempi antichi la gente usava impostarlo nella configurazione di PHP in modo che le variabili del post diventassero variabili globali, fino a quando non si erano resi conto che si trattava di un sogno degli hacker. per sicurezza, provalo sul tuo server di test e guarda cosa succede. – dqhendricks

+0

$ GLOBALS non è correlato in alcun modo alle variabili $ _POST o $ _GET. – dqhendricks

6

La serializzazione e in particolare la serializzazione sono piuttosto scomode. (D'altra parte non è chiaro il motivo per cui un linguaggio di scripting non può avere array come costanti ...)

Ma in realtà dipende dal modello di utilizzo. Normalmente si desidera definire globali per la memorizzazione delle impostazioni di configurazione. E le variabili globali e le costanti sono un uso appropriato per questo (nonostante il meme "globals are evil !! 1!"). Ma si consiglia di buttare tutto in una sorta di oggetto del registro o un array di almeno:

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

Questo dà la sintassi di accesso più semplice con config::$MY_ARRAY. Non è una costante, ma puoi facilmente fingere. Basta usare un oggetto ArrayObject o ArrayAccess e implementarlo in modo da rendere gli attributi di sola lettura. (. Fare offsetSet genera un errore)

Se si desidera una matrice soluzione costante globale, quindi un'altra alternativa (ho rubato questa idea dal define manual page) è quello di utilizzare una funzione al posto di una costante:

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

L'accesso non è ancora abbastanza costante, ma MY_ARRAY() è abbastanza breve. Sebbene l'accesso alla matrice con MY_ARRAY()["key1"] non sia possibile prima di PHP 5.3; ma ancora una volta questo potrebbe essere simulato con MY_ARRAY("key1") per esempio.

+0

Mario, cosa può, potenzialmente, andare storto con la serializzazione? Inoltre, né la funzione né la classe entrerebbero nello scope globale. – techexpert

+0

@techexpert, non c'è niente di sbagliato nella serializzazione. Ma 'unserialize (MY_ARRAY)' è piuttosto lungo e hai sempre bisogno di una variabile temporanea per decomprimere. Questo tipo di sconfigge lo scopo di costanti di facile accesso. Si potrebbe anche definire una funzione 'my_const_array (" NAME ")' per ottenerla da un registro. – mario

+0

Desideravo davvero trovare un'alternativa all'istruzione "define" per gli array, quindi è possibile passare la variabile a qualsiasi funzione in modo pulito, ad esempio: call_function (MY_ARRAY) – techexpert

Problemi correlati