28

PHPでは、次のようなコードを頻繁に記述しています。

$a = isset($the->very->long->variable[$index])
            ? $the->very->long->variable[$index]
            : null;

これを行うためのより簡単な方法はありますか?$the->very->long->variable[$index]できれば、 2回書く必要のないものが望ましいです。

4

5 に答える 5

54

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()ます。次の場合、サブジェクト変数の値が取得されます。

  • 変数が定義されています(存在します)
  • 変数はnullではありません

PHP初心者への注意:三項条件を使用しているが、サブジェクト変数が必ず定義されていることがわかっている場合(ただし、偽の値のフォールバックが必要な場合)、エルビス演算子があります。

$var = $dict['optional'] ?: 'fallback';

エルビス演算子を使用する$dict['optional']と、が無効なオフセットまたは$dict未定義の場合、E_NOTICE警告が表示されます(PHP 5および7)。そのため、PHP 5では、人々は恐ろしいissetを使用していますか?a:bは、入力について確信が持てない場合に使用します。

于 2015-08-11T19:58:09.753 に答える
10

残念ながら、RFCが拒否されたためです。また、issetは関数ではなく言語構造であるため、この場合に独自の関数を作成することはできません。

注:これは言語構造であり、関数ではないため、変数関数を使用して呼び出すことはできません。

于 2012-11-29T13:05:16.810 に答える
1

$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);
于 2012-11-29T13:09:11.213 に答える
1

未設定変数の代わりに割り当てるだけの場合はnull、次を使用できます。

$a = @$the->very->long->variable[$index];

@その命令がエラーをスローしないようにします

于 2017-08-29T20:35:51.893 に答える
-1

同じ問題に遭遇し、配列要素を参照しても通知や警告は発行されないが、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;
}
于 2015-01-14T17:57:26.693 に答える