Я люблю делать такие вещи в Perl: $foo = $bar || $baz
назначить $baz
в $foo
случае $bar
пустой или не определено. У вас также есть , $foo ||= $bletch
которые будут назначать только $bletch
в $foo
случае $foo
не определен или пустой.
Тройной оператор в этой ситуации утомителен и утомителен. Конечно, есть простой, элегантный метод, доступный в PHP?
Или единственный ответ - пользовательская функция, которая использует isset ()?
php
perl
operators
default-value
Том Оже
источник
источник
//
и//=
существуют с Perl v5.10.0. Оригинал||
и||=
тест на логическое значение, а не на определенность.Ответы:
В PHP 7 у нас наконец есть способ сделать это элегантно. Это называется нулевым оператором слияния . Вы можете использовать это так:
Это эквивалентно
источник
<=>
и довольно точная!null
значения. Например, если$_GET['name']
задана пустая строка, первая строка будет возвращать пустую строку, но мы можем вернуть «Джон Доу», используя$_GET['name'] ? $_GET['name'] : 'john doe'
.В PHP 5.3 есть сокращенный
?:
оператор:Который присваивает,
$bar
если это не пустое значение (я не знаю, как это будет отличаться в PHP от Perl), в противном случае$baz
, и такое же, как в Perl и более старых версиях PHP:Но PHP не имеет составного оператора присваивания для этого (то есть, нет эквивалента Perl
||=
).Кроме того, PHP будет шуметь, если
$bar
не установлен, если вы не отключите уведомления. Существует также семантическая разница междуisset()
иempty()
. Первый возвращает false, если переменная не существует или имеет значениеNULL
. Последние возвращает истину , если она не существует, или имеет значения0
,''
,false
илиNULL
.источник
The first returns
а неThe second
в вашем предпоследнем предложении.$var = isset($var) ? $var : 'default value';
Он говорит, что в ответе ... просто указывает на это снова для тех, кто просматривает его. :-DСпасибо за все отличные ответы!
Для тех, кто приезжает сюда для возможной альтернативы, вот некоторые функции, которые помогают избавиться от скуки из такого рода вещей.
Примеры:
Я уверен, что это можно улучшить.
источник
Распространенная идиома для совместимости со старыми версиями PHP:
Это работает для значений, которые могут быть оценены в логическом контексте. Преимущество здесь в том, что он также дает вам отладочный e_notice, если переменная не определена.
источник
$bool ? $bool : "default"
если$bool
оно не определено?isset($var) ? $var : DEFAULT
. Но звучит так, будто он все равно хочет их избегать.В PHP ранее, чем 7. *, можно использовать?: Для неопределенной переменной, ошибки которой локально подавляются с помощью
@
:источник
это еще один хороший формат для
isset
делаisset($foo) || $foo= $bar;
другой простой способ и даст вам больше контроля, так как вы можете добавить больше условий и назначить другую переменную в то же время
$foo = (isset($oData['foo']))?$bar['foo']:'default value';
источник
Возможное решение: defaultFor ()
Если у нас нет заводского решения (которое действительно очень раздражает), я бы порекомендовал следующего маленького помощника. Это делает работу в большинстве случаев:
Я надеюсь, что это близко к тому, что вы хотели достичь. Он не выдаст вам никаких уведомлений, если вы используете его с несуществующей переменной, и это довольно удобно. Конечно, у него есть недостаток: значение по умолчанию всегда вычисляется заранее, поэтому не используйте его с чем-то тяжелым в качестве второго параметра, например, file_get_contents или чем-то еще. В этих случаях вам лучше с isseting.
источник
Я думаю, что в целом делать что-то вроде этого:
плохая идея, если только
$bar
и$baz
оба не являются булевыми. Если они не:тогда возникает вопрос: что определяет, является ли что-то истинным или ложным? Большинство людей, вероятно, ожидают, что ноль будет ложным, а все остальное - правдой. Но с некоторыми языками (например, Ruby) только
false
иnil
являются ложными, что означает и то0
и другое1
. Из-за этой межъязыковой неоднозначности, я думаю, что лучше всего быть точным в следующих случаях:или:
источник