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

Тема в разделе "PHP Pro", создана пользователем KillDead, 8 ноя 2012.

Статус темы:
Закрыта.
  1. KillDead

    KillDead

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

    Код:
    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++) - всё работает как надо.
    Вопрос - сервер тупит или я? отдельно получить такое поведение не смог, только в самом скрипте.
     
  2. zonr

    zonr -=^.^=-

    Регистр.:
    10 фев 2010
    Сообщения:
    290
    Симпатии:
    287
    А если в конце строки с комментарием поставить ; ?
     
  3. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    тоже самое, сейчас проверил - если поставить в эотм месте комментарий // или #
    то цикл глючит, но если /**/ - выполняется норм. /* // */ тоже всё хорошо
     
  4. zonr

    zonr -=^.^=-

    Регистр.:
    10 фев 2010
    Сообщения:
    290
    Симпатии:
    287
    Отсюда.

    Что у тебя с ограничителями? :)
     
  5. Viodele

    Viodele Механик

    Administrator
    Регистр.:
    17 дек 2011
    Сообщения:
    110
    Симпатии:
    479
    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. По правде говоря, мне не совсем понятна суть такого скрипта, а именно, зачем для математически реализуемого расчета применять цикличности. Да, и еще одно. Комментарий в начале строки обычно перекрывает ее до самого конца. Исключение - комментарии типа /**/. Соответственно, компилятору фиолетово, какой знак стоит в конце комментированной строки.
     
  6. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    Спасибо что слушаете мой бред)
    Дык, в этом то и сама суть - не выдаёт ничего подобного. Ещё обратите внимание на две строчки выше
    Код:
    //for ($cv    =$ctp[0];$cv<=$ctp[1];$cv++)
    var_dump("!!!!!!", $start, $end, $IIcv);
    exit;
    По идее скрипт вообще не должен был работать. Он должен был вывести 20,10array(20,10) , NULL; и завершится. Но этого не происходит.
    Что до -

    Я просто упростил второй скрипт, там было много кода, Мне известно об обычном применении комментариев. Но, я говорю что когда я поставил // скрипт перестал нормально работать .


    Так, чтобы более понятно было, переписал и убрал всё лишнее
    Код:
    $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]
     
  7. Viodele

    Viodele Механик

    Administrator
    Регистр.:
    17 дек 2011
    Сообщения:
    110
    Симпатии:
    479
    Для начала, если сервер под линухами - попробовать изменить кодировку файла под UNIX + UTF-8 no BOM. Иногда такое поведение комментариев является следствием конфликта кодировок файла скрипта.
     
    latteo нравится это.
  8. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    спб, приму к сведению, увы, сегодня повторить не удалось этот фокус, всё пашет как и должно... пугает меня пхп...
     
  9. Viodele

    Viodele Механик

    Administrator
    Регистр.:
    17 дек 2011
    Сообщения:
    110
    Симпатии:
    479
    Да нет там ничего пугающего. Сразу из своего опыта могу сказать следующее: кодируя на PHP стоит сразу сваливать на UTF-8. Есть и другие случаи, когда разница в кодировках дает баги в выполнении скрипта. Например, если файл скрипта написан в UTF-8, а в БД записи в привычной cp1251, то вполне вероятно, что на выходе мы получим "иероглифы".
     
    Extalionez нравится это.
  10. Glorfin

    Glorfin Писатель

    Регистр.:
    4 дек 2012
    Сообщения:
    2
    Симпатии:
    0
    PHP:
    // комментарий который не даёт призракам появится
    echo "ghost kill you!";
    exit;
    for(
    $i =0$i<10$i++){
        echo 
    "$i -";
    }
    echo 
    "me ok!";
    По поведению похоже, что строки с комментарием, echo и exit - PHP относит к одной строке. Соответственно, все это он комментирует (т.к. // комментирует все, до симоволов переноса строки) и выводит цикл.
    Во втором случае - exit и echo не закомментированны - соответственно РНР выводит сообщение и останавливает скрипт по exit;

    Установите редактор типа notepad++ и там посмотрите символы переноса строк - скорее всего в этом проблема.
     
Статус темы:
Закрыта.