У меня есть очень простой MCVE для PHP 7.2.11:
$loopStart = 150 < 100 + 15;
for ( $count = $loopStart ; $count < 3 ; $count++ )
{
echo sprintf( "count=%d<br>", $count );
}
die("finished");
Запустив скрипт, я ожидаю такой вывод:
count=0
count=1
count=2
finished
Выполнение этого скрипта приводит к бесконечный цикл где $count
НИКОГДА увеличивается
Изменение первой строки на $loopStart = intval(150 < 100 + 15);
работает -> цикл for повторяется 3 раза, а затем заканчивается.
Я что-то пропустил или это очень забавная ошибка в PHP? Мне кажется, что PHP имеет серьезную проблему с назначением источника, где результат bool
но — особенно PHP — известен очень смягченным неявным приведением типов.
PHP делает НЕ приращение $count
и это не должно быть — независимо от того, какой тип [bool
или же int
или же float
] исходная переменная имеет.
Руководство не говоря это очень явно. Но ++
просто не определено для логических значений. В то время как настоящая арифметическая операция (false + 1)
действительно увеличивает true
,
Более конкретно посмотрите на zend_operators.c
Это просто ничего не делает для IS_BOOLEAN
вары.
Как это игнорирует массивы и несколько других типов.
Вы бы не ошиблись, если бы вы работали. Потому что вы знаете, это было. В PHP3.
$loopStart = 150 < 100 + 15;
оценивает false
так же $count
, $count++
оценивает false
а также false
всегда меньше чем 3
:
$loopStart = 150 < 100 + 15;
for ( $count = $loopStart ; $count < 3 ; $count++ ) {
var_dump($count);
var_dump($count < 3);
var_dump($count++);
exit;
}
Урожайность:
bool(false)
bool(true)
bool(false)
Увидеть https://3v4l.org/rMECJ