Тернарный оператор против логического

Могут ли при любых обстоятельствах эти два давать разные результаты или вообще есть ли между ними какая-либо разница (производительность и т. Д.):

$r = this() ?: that();

и...

$r = this() or that(); // $r = this() || that();

Предполагая, что нет никакой разницы, какой из них вы бы предложили использовать и почему?


person VxMxPx    schedule 08.09.2014    source источник
comment
@scragar: Вы говорите, что ?: и or ведут себя по-разному, если первый операнд является ложным значением? Если да, то как?   -  person Felix Kling    schedule 08.09.2014
comment
или является логическим оператором, который возвращает логическое значение.   -  person splig    schedule 08.09.2014
comment
Это не тернарно, есть только два входа. Посмотрите на мой ответ ниже или измените название вопроса.   -  person pid    schedule 08.09.2014


Ответы (3)


Второй имеет логический результат. На первый ограничений нет.

Если вам нужно логическое значение, используйте логические операторы.

Поскольку уточнение кода стоит на первом месте, и это территория микрооптимизации, просто игнорируйте разницу в производительности (если она есть).

person Karoly Horvath    schedule 08.09.2014

Чтобы быть TERNARY, вы не можете использовать ярлык ?:, который сворачивает значение с логическим оператором or, как показано вами.

Таким образом, настоящий тернарный оператор будет таким:

$r = this() ? other() : that();

Теперь вы не можете выразить это с помощью простого оператора or, который является частным случаем тернарного оператора:

$r = this() ? this() : that();  // := this() or that()

В остальном никакой разницы нет, кроме читабельности, которая важнее крошечных сомнительных оптимизаций.

person pid    schedule 08.09.2014
comment
Имеет смысл, но как бы вы тогда это назвали? - person VxMxPx; 08.09.2014
comment
Это все еще тернарный оператор, но в примере не используется фактическое использование тернарного оператора. В примере показан только частный случай, когда тернарность не имеет значения. - person pid; 08.09.2014

Привет, я предлагаю вам прочитать документацию, так как все там

http://php.net/manual/en/language.operators.logical.php

http://php.net/manual/en/language.operators.precedence.php

И

http://php.net/manual/en/language.operators.comparison.php#language.operators.comparison.ternary

Насколько я понимаю, основное отличие заключается в порядке приоритета, однако я считаю, что это редко (никогда) не является реальной проблемой, поскольку я никогда не смешиваю их. Даже тогда есть этот бит

Приоритет операторов и ассоциативность определяют только то, как группируются выражения, они не определяют порядок вычисления.

Что, если я правильно думаю, имеет отношение только к тому, как интерпретатор PHP их видит, и действительно не имеет Беринга в пользовательском коде.

Что касается производительности, то влияние настолько мало, что его вообще не существует, есть много, много других вещей, которые могут оказать реальное влияние на производительность, например, структура и количество запросов к базе данных, кэширование объектов при зацикливании вместо создания новых. экземпляр и т. д., что будет иметь гораздо большее влияние.

Лично я предпочитаю использовать тернарные операторы при проверке значений, которые не установлены, и установке значений по умолчанию. Рассмотрим этот пример

    if( isset( $_POST['date'] ){
            $date = $_POST['date'];
    }else{
            $date = date('Y-m-d');
    }

Вместо использования тернарного

    $date = ( isset( $_POST['date'] ) ? $_POST['date'] : date('Y-m-d');

Тернар намного чище, ИМО, но на самом деле это вопрос личных предпочтений.

person ArtisticPhoenix    schedule 08.09.2014