Размер имеет значение
Такая ещё вещь в ПХП вызывает мою искреннюю печаль. В руководстве написано, что при приведении переменной к булевскому типу, строка «»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
В перле аналогично:
perl -e«print ’ok’ if ’00’»
Комментарий для ef_end_y:
Да, я помню это.
Давеча Илья Бирман выкладывал ссылку на достаточно интересный «обзор» PHP:
http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design/
Комментарий для totus.livejournal.com:
http://bolknote.ru/all/3635
Комментарий для Евгения Степанищева:
Тогда историческими причинами, возможно, является наследие Perl, а не ориентация на чайников.
Комментарий для dionys.myopenid.com:
Да, но в ПХП «власть нуля» намного шире, я же описал ещё случаи.