Размер имеет значение

Такая ещё вещь в ПХП вызывает мою искреннюю печаль. В руководстве написано, что при приведении переменной к булевскому типу, строка «»0«» трактуется как false:

var_dump( (bool) "0"); // false
var_dump( (bool) "00"); // true

Сделано это по определённым причинам. ПХП, исторически, был языком не просто для чайников, а для фанерных чайников, когда снаружи приходят параметры в GET или POST запросе, ПХП их раскладывает в специальные переменные, но все данные имеют тип «строка» (иногда — массив строк).

Дальше, и тут есть своя логика, если снаружи приходит ноль, ПХП решает (типизации-то данных запросов нет), что программист в своей ХТМЛ-форме имел ввиду число ноль и ведёт себя соответствующе. Благодаря этому «if ($variable_from_get) {}» ведёт себя «правильнее».

Поэтому я называю ПХП языком не с «динамическим приведением типов», а с «нестабильным приведением типов». Потому что его правила приведения содержат исключения.

Такой «строковый ноль» может привести к сюрпризам:

var_dump(array_filter( [ 0, null, false, "00", "0" ])); // останется один элемент — "00"
var_dump(in_array("0", [ false ])); // true

Или вот, например, поведение конструкции «empty» с той же строкой (именно из документации по этой конструкции я узнал о существовании такого нуля, ещё в ПХП3):

$z = "0"; $zz = "00";
var_dump(empty($z)); // true
var_dump(empty($zz)); // false

При этом, один пробел и всё, ноль перестаёт быть «магическим»:

var_dump(in_array(" 0", [ false ])); // false
Поделиться
Отправить
6 комментариев
ef_end_y

В перле аналогично:
perl -e«print ’ok’ if ’00’»

Евгений Степанищев (bolknote.ru)

Комментарий для ef_end_y:

Да, я помню это.

Alexander Arkhireyev (totus.livejournal.com)

Давеча Илья Бирман выкладывал ссылку на достаточно интересный «обзор» PHP:
http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design/

Евгений Степанищев (bolknote.ru)

Комментарий для totus.livejournal.com:

http://bolknote.ru/all/3635

Denis Ibaev (dionys.myopenid.com)

Комментарий для Евгения Степанищева:

Да, я помню это.

Тогда историческими причинами, возможно, является наследие Perl, а не ориентация на чайников.

Евгений Степанищев (bolknote.ru)

Комментарий для dionys.myopenid.com:

Да, но в ПХП «власть нуля» намного шире, я же описал ещё случаи.

Популярное