PHPでは、次のようなコードを頻繁に記述しています。
$a = isset($the->very->long->variable[$index])
? $the->very->long->variable[$index]
: null;
これを行うためのより簡単な方法はありますか?$the->very->long->variable[$index]
できれば、 2回書く必要のないものが望ましいです。
PHP 7がリリースされ、この点でゲームチェンジャーであるため、更新。以前の回答はPHP5に関するものです。
PHP7はこの問題を解決します。これをPHPで書くことはよくあることですが、それは絶対にエレガントではありません。
PHP 7には、ヌル合体演算子(RFC)があります。これは、issetの三項条件の完全な省略形です。
その目標は、このタイプの状態を置き換えることです。
$var = isset($dict['optional']) ? $dict['optional'] : 'fallback';
それによって:
$var = $dict['optional'] ?? 'fallback';
さらに良いことに、null合体演算子は連鎖可能です。
$x = null;
# $y = null; (undefined)
$z = 'fallback';
# PHP 7
echo $x ?? $y ?? $z #=> "fallback"
# PHP 5
echo isset($x) ? $x : (isset($y) ? $y : $z)
null合体演算子は次のように動作しisset()
ます。次の場合、サブジェクト変数の値が取得されます。
PHP初心者への注意:三項条件を使用しているが、サブジェクト変数が必ず定義されていることがわかっている場合(ただし、偽の値のフォールバックが必要な場合)、エルビス演算子があります。
$var = $dict['optional'] ?: 'fallback';
エルビス演算子を使用する$dict['optional']
と、が無効なオフセットまたは$dict
未定義の場合、E_NOTICE
警告が表示されます(PHP 5および7)。そのため、PHP 5では、人々は恐ろしいissetを使用していますか?a:bは、入力について確信が持てない場合に使用します。
$the->very->long->variable
それが設定されていることを知っていて、配列インデックスについて心配していると仮定します。
$x = $the->very->long->variable;
$a = isset($x[$index]) ? $x[$index] : null;
または、コードの周囲で使用できるより一般的なバリアントの場合:
function array_valifset($arr,$k, $default=null) {
return isset($arr[$k]) ? $arr[$k] : $default;
}
次に、任意の配列値に対して次のように呼び出します。
$a = array_valifset($the->very->long->variable,$index);
未設定変数の代わりに割り当てるだけの場合はnull
、次を使用できます。
$a = @$the->very->long->variable[$index];
@
その命令がエラーをスローしないようにします
同じ問題に遭遇し、配列要素を参照しても通知や警告は発行されないが、null(少なくともPHP 5.6)が返されることを発見しました。
$foo = ['bar' => 1];
var_dump($bar = &$foo['bar']); // int 1
var_dump($baz = &$foo['baz']); // null
ifステートメント内:
if($bar = &$foo['bar']) {
echo $bar;
}
if($baz = &$foo['baz']) {
echo $baz;
}