Ошибка компилятора или нормальное поведение

Статус
В этой теме нельзя размещать новые ответы.

KillDead

Хранитель порядка
Регистрация
11 Авг 2006
Сообщения
894
Реакции
579
Я не претендую на очень хорошее знание пхп, особенно в реальных проектах. Вопрос возник когда редактировал ***но скрипт примерно такой -

Код:
if(){ if() { if(){ if(){ ....
 
$ctp = array("18", "20");
 
if ($ctp[1] >0 and ($ctp[0] == 0 or $ctp[0] == '')) $ctp[0] = '1';
for ($cv=$ctp[0];$cv<=$ctp[1];$cv++)
{
            var_dump("I = ", $cv);
... Тут 2.5к строк до конца этого цикла
}
всё ок.


Скрипт просто проходит от 18 до 20. Надо чтобы шёл и в обратную сторону. Делаю и замечаю очень странное поведение.

Код:
$ctp = array("20", "18");
...
$start = 10;
$end = 20;
$cv = 20;
 
//for ($cv    =$ctp[0];$cv<=$ctp[1];$cv++)
var_dump("!!!!!!", $start, $end, $IIcv);
exit;
for ($IIcv= $start ;$IIcv<=$end;$IIcv++)
{
    $cv--;
        var_dump("I = ", $cv);
 
}
var_dump("New II "$IIcv);
и на выход получаю
I = 19;
NULL;

Т.е он не обновил цикл, $IIcv - не существует , var_dump("!!!!!!", $start, $end, $IIcv);
exit; - не выполнил. На сервере стоит ioncube, пхп 5.2.17. Если удалить комментарий //for ($cv =$ctp[0];$cv<=$ctp[1];$cv++) - всё работает как надо.
Вопрос - сервер тупит или я? отдельно получить такое поведение не смог, только в самом скрипте.
 
А если в конце строки с комментарием поставить ; ?
 
тоже самое, сейчас проверил - если поставить в эотм месте комментарий // или #
то цикл глючит, но если /**/ - выполняется норм. /* // */ тоже всё хорошо
 
Следует помнить о том, что стили комментариев PHP действуют только внутри ограничителей PHP. Если PHP встретит эти символы комментариев вне ограничителей, то они, как и любой текст, будут помещены на html-страницу. Например:
<php
echo("<p>Hello</p>"); // нормальный комментарий
?>
// а вот этот комментарий отобразиться броузером.
Для просмотра ссылки Войди или Зарегистрируйся

Что у тебя с ограничителями? :)
 
HTML:
<pre><?php
    $ctp = array("20", "18");

    $start = 10;
    $end = 20;
    $cv = 20;
     
    for ($IIcv = $start; $IIcv <= $end; $IIcv++) {
        $cv--;
        echo ("I = $cv\r\n");
    }


    echo ("New II : $IIcv");
?></pre>
На вылете дает:
Код:
I = 19
I = 18
I = 17
I = 16
I = 15
I = 14
I = 13
I = 12
I = 11
I = 10
I = 9
New II : 21

А вообще, это тоже како-код. И незнание php тут не при чем, это общая информатика. Циклы for поддерживают практически в любом компиляторе обратный отсчет:
HTML:
<pre><?php
    $ctp = array("20", "18");

    $start = 10;
    $end = 20;
    $cv = 20;
     
    for ($IIcv = $end - 1; $IIcv >= $start - 1; $IIcv--) {
        echo ("I = $IIcv\r\n");
    }


    echo ("New II : $IIcv");
?></pre>

Только в результате в переменной $IIcv будет уже не 21, а 8. По правде говоря, мне не совсем понятна суть такого скрипта, а именно, зачем для математически реализуемого расчета применять цикличности. Да, и еще одно. Комментарий в начале строки обычно перекрывает ее до самого конца. Исключение - комментарии типа /**/. Соответственно, компилятору фиолетово, какой знак стоит в конце комментированной строки.
 
Спасибо что слушаете мой бред)
На вылете дает:
Код:
I = 19
I = 18
I = 17
I = 16
I = 15
I = 14
I = 13
I = 12
I = 11
I = 10
I = 9
New II : 21
Дык, в этом то и сама суть - не выдаёт ничего подобного. Ещё обратите внимание на две строчки выше
Код:
//for ($cv    =$ctp[0];$cv<=$ctp[1];$cv++)
var_dump("!!!!!!", $start, $end, $IIcv);
exit;
По идее скрипт вообще не должен был работать. Он должен был вывести 20,10array(20,10) , NULL; и завершится. Но этого не происходит.
Что до -

Только в результате в переменной $IIcv будет уже не 21, а 8. По правде говоря, мне не совсем понятна суть такого скрипта, а именно, зачем для математически реализуемого расчета применять цикличности. Да, и еще одно. Комментарий в начале строки обычно перекрывает ее до самого конца. Исключение - комментарии типа /**/. Соответственно, компилятору фиолетово, какой знак стоит в конце комментированной строки.
Я просто упростил второй скрипт, там было много кода, Мне известно об обычном применении комментариев. Но, я говорю что когда я поставил // скрипт перестал нормально работать .


Так, чтобы более понятно было, переписал и убрал всё лишнее
Код:
$somevar = 100500;
 
// комментарий который не даёт призракам появится
echo "ghost kill you!";
exit;
for($i =0; $i<10; $i++){
    echo "$i -";
}
echo "me ok!";
OUTPUT: 0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -me ok!

А теперь магия:
Код:
$somevar = 100500;
 
/* // комментарий который не даёт призракам появится */
echo "ghost kill you!";
exit;
for($i =0; $i<10; $i++){
    echo "$i -";
}
OUTPUT: ghost kill you!

Я вот про это спрашивал. wtf ? Работает только в самом говноскрипте на 6к строк и линейном выполнении, повторить отдельно мне не удалось.[/quote]
 
Для начала, если сервер под линухами - попробовать изменить кодировку файла под UNIX + UTF-8 no BOM. Иногда такое поведение комментариев является следствием конфликта кодировок файла скрипта.
 
спб, приму к сведению, увы, сегодня повторить не удалось этот фокус, всё пашет как и должно... пугает меня пхп...
 
Да нет там ничего пугающего. Сразу из своего опыта могу сказать следующее: кодируя на PHP стоит сразу сваливать на UTF-8. Есть и другие случаи, когда разница в кодировках дает баги в выполнении скрипта. Например, если файл скрипта написан в UTF-8, а в БД записи в привычной cp1251, то вполне вероятно, что на выходе мы получим "иероглифы".
 
PHP:
// комментарий который не даёт призракам появится
echo "ghost kill you!";
exit;
for($i =0; $i<10; $i++){
    echo "$i -";
}
echo "me ok!";

По поведению похоже, что строки с комментарием, echo и exit - PHP относит к одной строке. Соответственно, все это он комментирует (т.к. // комментирует все, до симоволов переноса строки) и выводит цикл.
Во втором случае - exit и echo не закомментированны - соответственно РНР выводит сообщение и останавливает скрипт по exit;

Установите редактор типа notepad++ и там посмотрите символы переноса строк - скорее всего в этом проблема.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху