$foo = $bar || $baz
が空または未定義の場合、$baz
を$foo
に割り当てるために、$bar
をPerlでこのようなことをするのが大好きです。また、$foo ||= $bletch
があります。これは、$bletch
が定義されていないか空の場合にのみ、$foo
に$foo
を割り当てます。
この状況での三項演算子は退屈で面倒です。確かにPHPで利用できるシンプルでエレガントなメソッドはありますか?
または、唯一の答えはisset()を使用するカスタム関数ですか?
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を返します。
PHP 7では、これを最終的にエレガントに行う方法があります。 ヌル合体演算子 と呼ばれます。次のように使用できます。
$name = $_GET['name'] ?? 'john doe';
これは同等です
$name = isset($_GET['name']) ? $_GET['name']:'john doe';
すべての素晴らしい答えをありがとう!
代替案を求めてここに来る他の人のために、この種のものから退屈を取り除くのに役立ついくつかの関数があります。
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バージョンとの互換性を保つための一般的なイディオムは次のとおりです。
$var = $bool or $var = "default";
// If I use it, then only with excessive spaces for clarity.
これは、ブールコンテキストで評価できる値に対して機能します。ここでの利点は、変数が定義されていない場合にデバッグe_noticeが表示されることです。
7. *より前のPHPでは、?:を使用して、@
でローカルにエラーが抑制されている未定義の変数に使用できます。
$foo = @$bar ?: $baz;
これはisset
の場合に適した別の形式です
isset($foo) || $foo= $bar;
別の簡単な方法で、より多くの条件を追加して同時に別の変数に割り当てることができるため、より多くの制御が可能になります
$foo = (isset($oData['foo']))?$bar['foo']:'default value';