Лучший способ дать переменной значение по умолчанию (имитировать 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);Я уверен, что они могут быть улучшены.