За последние 24 часа нас посетили 19646 программистов и 1696 роботов. Сейчас ищут 1869 программистов ...

Что за синтаксис такой?

Тема в разделе "PHP для новичков", создана пользователем alexxxus, 18 сен 2008.

  1. alexxxus

    alexxxus Активный пользователь

    С нами с:
    18 сен 2008
    Сообщения:
    6
    Симпатии:
    0
    Вот встретил такую запись в коде:

    Нигде раньше в книгах по РНР не встречал такого синтаксиса -- с вопросительными знаками и двоеточием...
    Как это можно это переписать в обычном синтаксисе, или
    поясните по-русски что сия строка кода делает?

    Спасибо.

    .
     
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Она делает
    PHP:
    1.  
    2. <?php
    3. if(stristr($content,'xml') or $content=""){
    4.         $content="";
    5. }
    6. else{
    7.         $content=$content;
    8. }
    Вообще все это можно записать еще короче и правильнее:
    PHP:
    1. <?php
    2. $content=(stristr($content,'xml'))?null:$content;
     
  3. alexxxus

    alexxxus Активный пользователь

    С нами с:
    18 сен 2008
    Сообщения:
    6
    Симпатии:
    0
    Хм, спасибо. Но не совсем понятно к чему так изголяться. А есть ли где в учебнике описаный пример?
    Может подкинет кто-нить ссылку...
     
  4. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    в 3 раза кода меньше
     
  5. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    alexxxus
    Называется тернарный оператор

    Раньше в документации было, сейчас чего-то найти не могу.
     
  6. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    alexxxus
    Вообщем, то, что идет после ? - это то, что в обычном коде идет после if, а : - это else. При чем записывать можно только одину конструкцию в каждом блоке, и некоторые конструкции использовать нельзя. Например нельзя return и echo (но можно print).
    Простой пример:
    PHP:
    1. <?php
    2. $a="Слово";
    3. $a=="Слово"?print "Правильно":print "Не правильно";
    Если там ^ вместо print поставить echo, работать не будет.
    Зато можно так
    PHP:
    1. <?php
    2. $a="Слово";
    3. echo $a=="Слово"?"Правильно":"Неправильно";
    Вообщем, часто помогает сократить код.
     
  7. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
  8. neverlose

    neverlose Активный пользователь

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    :) много лишнего
    if( strstr($content), 'xml')
    $content = '';
     
  9. Jensi

    Jensi Активный пользователь

    С нами с:
    9 апр 2009
    Сообщения:
    299
    Симпатии:
    0
    Помогите пожалуйста "проговорить" это:
    Код (Text):
    1.  
    2. $a="Слово";
    3. echo $a=="Слово"?"Правильно":"Неправильно";
    Пока я так смог понять: Если $a равна 'Слово', то выводить правильно,а иначе отрицательный ответ:)
    И на сколько длинные могут быть коды с тернарным оператором?
    Ещё, скорость работы скрипта не замедлится,если использовать этот оператор?
     
  10. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Jensi
    Эти конструкции для длинных проверок может и экономят место, но становятся ужастно неудобными и нечитаемыми.
    Медленней или быстрей — дело в том, что операции они проводят одинаковые в плане логических проверок.
    Теже преобразования, сравнения и пр, только записываются по-разному.
    В одних случаях они экономят место, но злоупотреблять НЕЛЬЗЯ ими, иначе код будет говеным.
    Вот, например, хороший стиль:

    PHP:
    1. <?php
    2.  
    3. // Хорошо
    4. $id = isset($_GET['id']) ? true : false;
    5.  
    6. // Плохо
    7. if(isset($_GET['id'])) {
    8.     $id = true;
    9. }else{
    10.     $id = false;
    11. }
    12.  
    13. // Плохо
    14. $str = (count(explode(', ', implode(', ', array('abc', 'def'))))) ? count(array('abc', 'def')) : null;
    15.  
    16. ?>
    Длинна идентична блоку if() (тому, что в скобках).
     
  11. Jensi

    Jensi Активный пользователь

    С нами с:
    9 апр 2009
    Сообщения:
    299
    Симпатии:
    0
    Т.е. лучше этот оператор применять в маленьких проверках, так? Попробовал всё это сделать, потренировался и всё понятно стало:)
     
  12. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Тогда, когда это оправданно.
    Например, я считаю необправданным писать блок if-else, если у меня выражение вернет простой результат true/false.
    Пример я привел выше.
    Но когда код должен что-то делать, пускай в нем даже одна единственная инструкция, его следует заключать в блок if.

    Думаю сами поймете, когда будете писать возврат одной единственной строчки кода, которая ничего не делает. :)
     
  13. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    PHP:
    1. <?php
    2.  
    3. // Хорошо
    4. $id = isset($_GET['id']) ? true : false;
    5.  
    6. // Вообще отлично
    7. $id = isset($_GET['id']);
    8.  
    9. // Значение по-умолчанию
    10. $a = !empty($_GET['a']) ? $_GET['a'] : 15;
    Тернарный оператор - отличная штука - регулярно им пользуюсь.
    Многое еще зависит от форматирования.
    Жаль, что в пхп с ним связан серьезный баг, потому его основное удобство пропадает.
     
  14. Jensi

    Jensi Активный пользователь

    С нами с:
    9 апр 2009
    Сообщения:
    299
    Симпатии:
    0
    На "ты", пожалуйста:)
    Где можно почитать или расскажите?
     
  15. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Нигде не видел. Кросспост темы с iBash'a спецом для тебя :)

    Ну и ко мне тоже на "ты", пожалуйста :)