Я тестирую код с младшая версия v4.3 и v5.3 PHP, это немного кода с продолжить после без точки с запятой. Это работает и дает странный вывод.
for ($i = 0; $i < 5; ++$i) {
if ($i == 2)
continue
print "$i\n";
}
//Output: 2 its strange
Но с echo
выдает ошибку Parse error: syntax error, unexpected 'echo' (T_ECHO)
for ($i = 0; $i < 5; ++$i) {
if ($i == 2)
continue
echo "$i\n";
}
//Output: Parse error: syntax error, unexpected 'echo' (T_ECHO)
continue
оператор принимает параметр, так что вы можете добавить больше выражений после него:
continue <foo>;
print
является выражением и может использоваться как часть других выражений, поэтому continue print();
действительный синтаксис. Это также почему 2
выводится, единственное утверждение continue print $i;
выполняется, когда $i == 2
,
echo
это утверждение и может не использоваться как часть других выражений, <anything> echo
неверный синтаксис
Причина в том, что оператор continue принимает необязательное целое число (число циклов для продолжения), которое по умолчанию равно 1, если ни один не указан.
Не имея точки с запятой, PHP примет следующее выражение как целое число. Языковая конструкция print
возвращает целое число, так что все в порядке. Тем не мение, echo
это также языковая конструкция, но она не имеет возвращаемого значения. Поэтому, пока синтаксический анализатор ищет целое число, он сталкивается с языковой конструкцией без возвращаемого значения, он запутывается и выдает ошибку.
Реальное решение заключается в том, чтобы вставить эту точку с запятой, потому что, не имея такой, вы на самом деле потенциально изменяя поведение continue
.
(В этом случае вы не, потому что печать всегда возвращает один, но в других случаях это может привести к ошибкам в вашем коде.)
почти наверняка, потому что в более ранних версиях php
function f(){return 2;}
for($i=0;$i<9;++$i){
for($ii=0;$ii<99;++$ii){
continue f();
}
}
и затем он продолжит работу с номером цикла, возвращенным функцией f () (в этом случае цикл $ i. Если он вернет 1, он продолжит цикл $ ii).
в современных версиях PHP вы можете жестко закодировать число, но вы больше не можете продолжать работать с переменным числом, это должно быть решено во время компиляции. и print () возвращает int. echo не делает, поэтому вы получаете ошибку, аргумент для продолжения должен быть int.
Причина: Выход: 2
потому что весь продолжить выведите «$ i \ n»; оценивается как единое целое
выражение, и поэтому print вызывается только когда $ i == 2 верно. (The
возвращаемое значение print передается для продолжения в качестве числового аргумента.)