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

Такая ещё вещь в ПХП вызывает мою искреннюю печаль. В руководстве написано, что при приведении переменной к булевскому типу, строка «"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

Denis Ibaev (dionys.myopenid.com) № 5

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

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

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

Евгений Степанищев (bolknote.ru) автор № 6
Да, но в ПХП «власть нуля» намного шире, я же описал ещё случаи.