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


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

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

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

Author: BoltClock, 2011-05-12

5 answers

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.

 173
Author: BoltClock, 2011-05-12 08:30:58

В PHP 7 у нас наконец-то появился способ сделать это элегантно. Он называется оператором объединения нулей. Вы можете использовать его следующим образом:

$name = $_GET['name'] ?? 'john doe';

Это эквивалентно

$name = isset($_GET['name']) ? $_GET['name']:'john doe';
 65
Author: jpschroeder, 2016-04-22 14:48:19

Распространенной идиомой для обеспечения совместимости со старыми версиями PHP является:

 $var = $bool   or   $var = "default";
 // If I use it, then only with excessive spaces for clarity.

Это работает для значений, которые могут быть оценены в логическом контексте. Преимущество здесь в том, что оно также дает вам указанное отладочное e_notice, если переменная не определена.

 7
Author: mario, 2011-05-12 01:59:54

Спасибо за все замечательные ответы!

Для всех, кто приходит сюда в поисках возможной альтернативы, вот некоторые функции, которые помогают избавиться от скуки в подобных вещах.

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);

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

 7
Author: Tom Auger, 2012-04-22 16:40:31

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

$foo = @$bar ?: $baz;
 1
Author: AndreyS Scherbakov, 2017-10-28 11:23:08