Почему строки ведут себя как массив в PHP 5.3?

У меня есть этот код:

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

Он отлично работает в PHP 5.5, но в PHP 5.3 условие возвращает true, а $host содержит строку типа pjba01. Он возвращает первую букву $tierHosts['host'], то есть p.

Что не так с моим кодом?


person Ritesh    schedule 14.09.2015    source источник
comment
Вы можете обойти это поведение с помощью (is_array($host) && isset($host["name"])). Всегда сверяйтесь с типом, который вам нужен, если неясно, какой тип вы получите. Подробнее об описанном вами поведении см. в ответе Rizier123.   -  person TobiasJ    schedule 14.09.2015
comment
Если вас интересуют другие вещи, которые могут застать вас врасплох в PHP, прочтите это. eev.ee/blog/2012/04 /09/php-a-fractal-of-bad-design   -  person Almo    schedule 14.09.2015
comment
Почему строки ведут себя как массив...? Потому что они массив...   -  person SnakeDoc    schedule 14.09.2015


Ответы (1)


Вы можете получить доступ к строкам как к массиву и предыдущим версиям PHP 5.4. например, ваш name был молча преобразован в 0, это означает, что вы получили доступ к первому символу этой строки:

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

После 5.3 такие офсеты будут выкидывать уведомления, о чем можно прочитать и в мануале:

Начиная с PHP 5.4 смещения строк должны быть либо целыми, либо целочисленными строками, иначе будет выдано предупреждение. Ранее смещение типа «foo» молча приводилось к 0.

person Rizier123    schedule 14.09.2015