Работают ли логические операторы PHP как JavaScript? - PullRequest
7 голосов
/ 12 марта 2011

В JavaScript мне больше всего нравится то, что логические операторы очень мощные:

  • && может использоваться для безопасного извлечения значения поля объекта и возвращает ноль, если объект или поле не были инициализированы

    // returns null if param, param.object or param.object.field
    // have not been set
    field = param && param.object && param.object.field;
    
  • || может использоваться для установки значений по умолчанию:

    // set param to its default value
    param = param || defaultValue;
    

Разрешает ли PHP также использовать логические операторы?

Ответы [ 4 ]

13 голосов
/ 12 марта 2011

PHP возвращает true или false. Но вы можете эмулировать JavaScript r = a || b || c с помощью:

$r = $a ?: $b ?: $c;

Относительно 'ands', что-то вроде:

$r = ($a && $a->foo) ? $a->foo->bar : null;
8 голосов
/ 12 марта 2011

Логические операторы PHP не возвращают значение ни с одной из их сторон: они всегда получат логическое значение.

Например, выполнив:

$result = $a && $b;

Всегда получим $result содержат логическое значение: true или false - и никогда $a или $b.

2 голосов
/ 12 марта 2011

Вы можете настроить аналогичную функциональность, используя троичные операторы .

1 голос
/ 19 мая 2016

Пересмотрено :

Что касается логического ANDing в PHP для достижения того же вида результата, что и в JavaScript, вы можете использовать вариант традиционной троичной формы, как показано ниже:

<?php
    // prelim
    $object = new stdClass;
    $object->field = 10;
    $param = new stdClass;
    $param->object = $object;

    // ternary variant     
    $field = !($param && $param->object)?:  $param->object->field;
    echo $field,"\n";

    // alternative to ANDing
    $field = get_object_vars( $param->object )["field"] ?? null;
    echo $field,"\n";

См. действующий код

Оператор "Elvis" "?:" Присваивает результат полю $ только если условное выражение ложно.Таким образом, если $ param существует так же, как и $ param-> object, вам нужно использовать оператор NOT ("!"), Чтобы получить желаемый результат.

Вы также можете выполнить задачу получения полевых данных без ANDing, используя оператор объединения нулей ("??") в PHP 7 в тандеме с get_object_vars().

...