PHP: сделать это || это (как JavaScript)

1

В javascript мы можем использовать || для выполнения второго действия, если первый не выполняется, например:

function getObject(id_or_object) {
    var obj = document.getElementById(id_or_object) || id_or_object;
    return obj;
}

Как мы можем это сделать в PHP?

Если мы не сможем, я могу поклясться, что видел это || используется в PHP. Что это значит?

Я хочу делать:

function fix_item($item) {
    $item['armor'] = $item['armor'] || 0;
    return $item;
}

Но это не работает, поэтому я использую

function fix_item($item) {
    if (!isset($item['armor'])) $item['armor'] = 0;
    return $item;
}

но мне не нравится второй метод. Любые идеи?

Теги:
short

3 ответа

2
Лучший ответ

Вы можете использовать || (OR) для сравнения true/false, но (это одна из известных (аргументированных) ошибок дизайна) в PHP-дизайне: короткое замыкание не возвращает значение операнда (как вы делали в примере с javascript-логикой), но boolean result.

Что означает, что:
$item['armor'] = $item['armor'] || 0; не работает так, как вы планировали (например, в javascript).
Вместо этого он установил бы $item['armor'] в значение boolean true/false (в зависимости от результата: $item['armor'] || 0).

Однако можно использовать "ленивую оценку" так же, как вы можете использовать ее в javascript:
isset($item['armor']) || $item['armor'] = 0;
(с добавлением isset для предотвращения ошибки Undefined variable).
Он по-прежнему четко описывает, каково ваше намерение, и вам не нужно инвертировать результат логического isset с помощью ! (что было бы nececary для if и && (AND)).

В качестве альтернативы можно также сделать:
$item['armor'] = $item['armor'] OR $item['armor'] = 0; (обратите внимание, что это даст E_NOTICE)
(Я думаю, что читаемость не так хороша),

или тройной:
$item['armor'] = isset($item['armor'])? $item['armor']: 0;
(с "лучшей"/"более общей" читабельностью, но добавил размер кода).

Для PHP7 и выше см. Ответ Tom DDD.

2

если вы используете php 7, вы можете использовать оператор null coalesce

$a ?? $b ?? $c 

это оценивается до первого ненулевого значения. Это очень похоже на || от javascript.

  • 3
    PHP 7 пока недоступен.
1

Это проверяет $ item ['armor'], если это правда, он возвращает то, что находится справа от? оператор, если он ложный, он возвращает то, что сразу справа: (я также использовал тернарный оператор в javascript).

function fix_item($item) {
    $item['armor'] = $item['armor'] ? $item['armor'] : 0;
    return $item;
}
  • 2
    Вы пропустили : где-то.
  • 0
    Вы абсолютно правы! Function fix_item ($ item) {$ item ['armor'] = $ item ['armor']? $ item ['armor']: 0; вернуть $ item; }
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню