2013-07-25 4 views
1

Перед выполнением этого кода, я просто проверял по ошибке, и понял, что это не остановит:Почему этот код представляет собой бесконечный цикл?

$var = "any"; 
for ($i=1; $i < 2; $i++){ 
    $var.$i = "any"; 
} 

Почему это производит бесконечный цикл? И почему PHP не создает ошибку?

+3

Не ходите. Выполнить из PHP. – Will

ответ

5

Я сделал простой тест:

echo $i; 
$var.$i = "any"; 
var_dump($var); 

Результат:

1string(3) "any" 
anzstring(3) "any" 

Так $ я трансформируются в «ANZ» и не проходит проверку, чтобы выйти из цикла.

$ var. $ I = "any"; не совсем правильно, но я не знаю, что вы пытаетесь сделать, но если вы хотите, чтобы заполнить и массив, вы должны сделать что-то подобное:

$var = array(); 
for ($i=1; $i < 2; $i++){ 
$var[] = "any"; 
} 

Если вы хотите изменить свою строку по буквам:

$var = "any"; 
    for ($i=1; $i < 2; $i++){ 
    $var[$i] = "a"; // asign a new letter to the string at the $i position 
    } 
+0

спасибо morsok, я знал это, мне просто интересно, почему PHP не производит никаких ошибок, если этот '$ var. $ I' недействителен, то почему PHP выполняется? –

+0

Строго говоря, это справедливо, поведение просто не то, что вы ожидаете.Внутри я не могу точно сказать, что он делает, но, похоже, он меняет $ i на строку «any», причем последняя буква добавляется значение $ i, делающее «y» go 'z', и это всегда < 2 hense это идет к бесконечному циклу. – Morsok

+0

@Skippy Но я не вижу никакого 'z' здесь, хорошо, вы можете объяснить, что такое' z'? –

1

Это неправильно $var.$i = "any"; потому, что это выражение эквивалентно:

$var.($i = "any"); 

который сопоставляет $i на новое значение, поэтому состояние которых в то время как петли проверки всегда будут истинными.

+0

Я знал это, что неправильно? почему делает цикл для Infinity! –

+0

Петля хорошая. Но используйте '$ var. $ I =" any ";' это недопустимо. –

2

Когда вы следующие $var.$i = 'any' вы установите $i переменную и переменную $var. Итак, цикл никогда не останавливается, потому что var_dump($i < 1) возвращает true.

$var = 'var'; 
$i = 1; 
$var.$i = 'var'; 

var_dump($i); 

Возврат string(3) "var".

Этот цикл никогда не остановится, потому что $ я всегда сбрасывается в «вар», которое меньше 1.

0

PHP5.4 +.

Вы получите результат «anz» после $ i ++, когда $ i == 'any'. $ i == 'any', после назначения, и это, на самом деле, то, что он должен получить. Trick находится в строке «$ i =« any ». Даже когда «=» имеет более низкий приоритет, чем «.», Почему вы думаете, что он не должен помещать «any» внутри $ i?

Попробуйте вместо этого:

$var = "any"; 
for ($i=1; $i < 2; $i++){ 
$i.$var = "anything"; 
} 

И ваш цикл будет работать. И $ var получит значение «ничего». Это не похоже на ошибку. Просто неожиданное поведение для кого-то.

Смежные вопросы