2012-11-29 15 views
6

Ho bussato a un fenomeno in una sorgente php esistente, con accesso al campo senza apostrofo come questo: $ _GET [test].Accesso alla matrice PHP senza virgolette

ho avuto dubbi, anche non sanno, che questo è un modo possibile, così ho scritto un breve esempio per i test:

echo "Array Test, fields without apostrophe, like \$_GET[fieldname]<BR><BR>"; 
$a = array(); 
$a['test'] = "ArrayValue"; 
echo "case 1 -> \$a['test']: " . $a['test'] . "<BR>"; 
echo "case 2 -> \$a[\"test\"]: " . $a["test"] . "<BR>"; 
echo "case 3 -> \$a[test]: " . $a[test] . "<BR>"; 

e funziona, ogni risultato ottenuto il valore (ArrayValue) .

preferisco il metodo di accesso come il caso 2.

è il caso 3 un normale, ha permesso stile di codifica in php?

+1

Ricordo di aver ricevuto un avviso quando si usano costanti non definite, e viene trattato come una stringa. Ma no, questo non è "stile di codifica consentito". –

+0

Grazie per la tua risposta! Ho controllato i log di apache, che non lanciano un avviso (php.ini: error_reporting = E_ALL & ~ E_DEPRECATED; phpinfo: 22527). Felice di sentire, questo non è un buon stile! – Peter

risposta

7

Quello che succede qui è che PHP vede a constant chiamato test. Se la costante è definita, il valore viene restituito, non è definito, PHP torna alla stringa "test". Per esempio:

$array = array("A" => "Foo", "B" => "Bar", "C" => "Baz") 
define("B", "C"); 

echo $array[A]; // The constant "A" is undefined, 
        // so PHP falls back to the string "A", 
        // which has the value "Foo". 
echo $array["B"]; // The result is "Bar". 
echo $array[B]; // The value of constant "B" is the string "C". 
        // The result is "Baz". 

E 'per la compatibilità all'indietro e non si dovrebbe mai usare. Se utilizzerai il valore turn on notices, vedrai che PHP si lamenta a riguardo.

4

Se non si inserisce la chiave tra virgolette, verrà gestita come una costante indefinita (supponendo che non sia definita da nessuna parte), che potrebbe funzionare per ora, ma può fallire nelle future versioni di PHP. Perciò è semplicemente sbagliato e la documentazione di PHP afferma che questa variante è anche sbagliata. Controlla 'Arrays do's and don'ts'.

A proposito: se si inserisce la chiave tra virgolette, vengono visualizzate le variabili all'interno del nome-chiave.

1

L'utilizzo di nomi di chiavi di array senza virgolette è una funzione legacy in PHP. In origine era il modo di farlo, ma non è più raccomandato ed è ancora supportato solo per compatibilità con le versioni precedenti. Se viene attivata la modalità rigorosa, verrà visualizzato un messaggio di avviso.

La ragione per cui funziona è che vede il nome chiave in questo modulo come una costante. Quando PHP vede una costante sconosciuta, ha come valore predefinito il nome della costante, quindi funziona come una sostituzione di stringa.

Si interromperà se nel proprio programma si fosse impostato define() per impostare il valore di tale costante. Inoltre, non funziona se il nome della chiave contiene spazi, inizia con una cifra o è un nome costante non valido per qualsiasi altro motivo.

Per questi motivi, non è consigliabile utilizzare questo metodo.

Ma soprattutto, gli sviluppatori PHP hanno dichiarato pubblicamente che non è una buona pratica, il che potrebbe significare che le future versioni di PHP rimuoveranno la possibilità di scrivere codice come questo.