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


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

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

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

5 87

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

Я уверен, что они могут быть улучшены.

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

$foo = @$bar ?: $baz;