web-dev-qa-db-ja.com

変数にデフォルト値を与える最良の方法(Perlをシミュレートする||、|| =)

$foo = $bar || $bazが空または未定義の場合、$baz$fooに割り当てるために、$barをPerlでこのようなことをするのが大好きです。また、$foo ||= $bletchがあります。これは、$bletchが定義されていないか空の場合にのみ、$foo$fooを割り当てます。

この状況での三項演算子は退屈で面倒です。確かにPHPで利用できるシンプルでエレガントなメソッドはありますか?

または、唯一の答えはisset()を使用するカスタム関数ですか?

108
Tom Auger

PHP 5.3には、簡略表記の?:演算子があります。

$foo = $bar ?: $baz;

空の値でない場合$barを割り当てます(PerlのPHPでこれがどのように異なるかわかりません)、そうでない場合$baz、およびこれと同じですPerlおよび古いバージョンのPHP:

$foo = $bar ? $bar : $baz;

ただし、PHPには、このための複合代入演算子がありません(つまり、Perlの||=に相当するものはありません)。

また、PHPは、通知をオフにしない限り、$barが設定されていない場合にノイズを発生させます。 isset()empty()の間にも意味的な違いがあります。前者は、変数が存在しないか、NULLに設定されている場合はfalseを返します。後者は、存在しない場合、または0''false、またはNULLに設定されている場合にtrueを返します。

195
BoltClock

PHP 7では、これを最終的にエレガントに行う方法があります。 ヌル合体演算子 と呼ばれます。次のように使用できます。

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

これは同等です

$name = isset($_GET['name']) ? $_GET['name']:'john doe';
91
jpschroeder

すべての素晴らしい答えをありがとう!

代替案を求めてここに来る他の人のために、この種のものから退屈を取り除くのに役立ついくつかの関数があります。

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

これらは改善できると確信しています。

8
Tom Auger

古いPHPバージョンとの互換性を保つための一般的なイディオムは次のとおりです。

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

これは、ブールコンテキストで評価できる値に対して機能します。ここでの利点は、変数が定義されていない場合にデバッグe_noticeが表示されることです。

7
mario

7. *より前のPHPでは、?:を使用して、@でローカルにエラーが抑制されている未定義の変数に使用できます。

$foo = @$bar ?: $baz;
3

これはissetの場合に適した別の形式です

isset($foo) || $foo= $bar;

別の簡単な方法で、より多くの条件を追加して同時に別の変数に割り当てることができるため、より多くの制御が可能になります

$foo = (isset($oData['foo']))?$bar['foo']:'default value';

0
Bassem Shahin