В 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;
}
но мне не нравится второй метод. Любые идеи?
Вы можете использовать ||
(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.
если вы используете php 7, вы можете использовать оператор null coalesce
$a ?? $b ?? $c
это оценивается до первого ненулевого значения. Это очень похоже на || от javascript.
Это проверяет $ item ['armor'], если это правда, он возвращает то, что находится справа от? оператор, если он ложный, он возвращает то, что сразу справа: (я также использовал тернарный оператор в javascript).
function fix_item($item) {
$item['armor'] = $item['armor'] ? $item['armor'] : 0;
return $item;
}
:
где-то.