Лучший способ дать переменной значение по умолчанию (имитировать Perl||, ||=)
Я люблю делать такие вещи в Perl:$foo = $bar || $baz
присвоить $baz
to $foo
Если $bar
является пустым или неопределенным. У вас также есть $foo ||= $bletch
который будет назначать только $bletch
до $foo
Если $foo
не определен и не пуст.
тернарный оператор в этой ситуации утомителен и утомителен. Конечно, есть простой, элегантный метод, доступный в PHP?
или это единственный ответ пользовательской функции, которая использует isset ()?
5 ответов:
PHP 5.3 имеет стенографию
?:
оператор:$foo = $bar ?: $baz;
который назначает
$bar
если это не пустое значение (я не знаю, как это будет отличаться в PHP от Perl), иначе$baz
, и это то же самое, что и в Perl и более старых версиях PHP:$foo = $bar ? $bar : $baz;
но PHP не имеет составного оператора присваивания для этого (то есть нет эквивалента Perl
||=
).кроме того, PHP будет шуметь, если
$bar
не установлен, если вы не включите уведомления отключены. Существует также семантическая разница междуisset()
иempty()
. Первый возвращает false, если переменная не существует или имеет значениеNULL
. Последний возвращает true, если он не существует или имеет значение0
,''
,false
илиNULL
.
в PHP 7 у нас наконец есть способ сделать это элегантно. Он называется оператор коалесценции Null. Вы можете использовать его следующим образом:
$name = $_GET['name'] ?? 'john doe';
Это эквивалентно
$name = isset($_GET['name']) ? $_GET['name']:'john doe';
общая идиома, чтобы оставаться совместимым с более старыми версиями PHP является:
$var = $bool or $var = "default"; // If I use it, then only with excessive spaces for clarity.
это работает для значений, которые могут быть оценены в логическом контексте. Преимущество здесь заключается в том, что он также дает вам сказал debug e_notice если переменная не определена.
Спасибо за хорошие ответы!
для тех, кто приходит сюда за возможной альтернативой, вот некоторые функции, которые помогают снять скуку с такого рода вещей.
function set_if_defined(&$var, $test){ if (isset($test)){ $var = $test; return true; } else { return false; } } function set_unless_defined(&$var, $default_var){ if (! isset($var)){ $var = $default_var; return true; } else { return false; } } function select_defined(){ $l = func_num_args(); $a = func_get_args(); for ($i=0; $i<$l; $i++){ if ($a[$i]) return $a[$i]; } }
примеры:
// $foo ||= $bar; set_unless_defined($foo, $bar); //$foo = $baz || $bletch $foo = select_defined($baz, $bletch);
Я уверен, что они могут быть улучшены.