Intereting Posts

Лучший способ присвоить переменной значение по умолчанию (имитировать Perl ||, || =)

Мне нравится делать такие вещи в Perl: $foo = $bar || $baz $foo = $bar || $baz чтобы присвоить $baz $foo если $bar пуст или не определен. У вас также есть $foo ||= $bletch который присваивает $bletch $foo если $foo не определен или пуст.

Тройной оператор в этой ситуации утомительный и утомительный. Конечно, есть простой, элегантный метод, доступный в PHP?

Или это единственный ответ на пользовательскую функцию, которая использует isset ()?

PHP 5.3 имеет сокращение ?: Operator:

 $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. 

Это работает для значений, которые могут быть оценены в булевом контексте. Преимущество здесь в том, что он также дает вам указанную отладку 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); 

Я уверен, что их можно улучшить.

В PHP раньше, чем 7. *, можно использовать?: Для неопределенной переменной, имеющей ошибки, локально подавленные с помощью @ :

 $foo = @$bar ?: $baz;