2015-09-14 15 views
17

Ho questo codice:Perché le stringhe si comportano come un array in PHP 5.3?

$tierHosts['host'] = isset($host['name']) ? $host['name'] : $host; 

Sta funzionando benissimo in PHP 5.5, ma in PHP 5.3 la condizione restituisce true, mentre $host contiene una stringa come pjba01. Restituisce la prima lettera di $tierHosts['host'], ovvero p.

Cosa c'è di così sbagliato nel mio codice?

+2

È possibile ignorare questo comportamento con '(is_array ($ host) && isset ($ host [" nome "]))'. Controlla sempre il tipo di cui hai bisogno se non è chiaro quale tipo hai ricevuto. Per maggiori dettagli sul comportamento che hai descritto vedi la risposta di Rizier123s. – TobiasJ

+0

Se sei interessato ad alcune delle altre cose che possono sorprendervi in ​​PHP, leggi questo. http://eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design/ – Almo

+1

Perché le stringhe si comportano come un array ...? Perché sono un array ... – SnakeDoc

risposta

23

You can access strings like an array e prima di PHP 5.4 offset come il vostro name sono stati in silenzio colato a 0, significa che si accede al primo carattere della stringa:

character | p | j | b | a | 0 | 1 | 
----------------------------------- 
index  | 0 | 1 | 2 | 3 | 4 | 5 | 

Dopo 5.3 tali compensazioni getterà un avviso, come si può anche leggere nel manuale:

A partire da PHP 5.4 gli offset di stringa devono essere numeri interi o stringhe di tipo intero, altrimenti verrà generato un avviso. Precedentemente un offset come "foo" veniva trasmesso silenziosamente a 0.

Problemi correlati