0

以下のためのより効率的で、よりクリーンで、より短い形式はありますか?

if($x==null or $y==null or $z==null or $w==null) return true;

一般に、null変数の名前も取得するにはどうすればよいですか?

function any_null(array $a){
    foreach($a as $v) if ($v==null) return //variable name;
    return false;
}
var_dump(any_null(array($x,$y,$z,$w)));
4

1 に答える 1

9

issetは複数の引数を取ることができます。

複数のパラメーターが指定されている場合、isset()は、すべてのパラメーターが設定されている場合にのみTRUEを返します。

これはあなたが望むものの反対なので、単純な否定が必要です:

!isset($x, $y, $z, $w)

追加のボーナスはisset、通常の関数ではなく、未定義の変数に関する通知を発生させないことです。


変数から名前を取得するのは困難です。何らかの方法でそれらすべてをチェックする必要があります。最良かつ最もスケーラブルなソリューションは、変数の名前をキーとして連想配列を使用することだと思います。

function any_null(array $a){
    foreach($a as $k => $v) if ($v === null) return $k;
    return false;
}
any_null(array('x' => $x, 'y' => $y));

厳密な比較に注意してください(===)。それ以外falseの場合""、、、0およびarray()も「null」としてカウントされます。

もう1つの解決策は、変数の名前のみを渡し、 $GLOBALS配列を使用することです。ここでは、func_get_argsの呼び出しと組み合わせて、少し冗長な呼び出し規約を取得しました。

function any_null(){
    $a = func_get_args();
    foreach($a as $k) if (!isset($GLOBALS[$k])) return $k;
    return false;
}
any_null('x', 'y', 'z');

ただし、この最後のソリューションには多くの欠点があります。グローバルスコープ内の変数のみをテストでき、標準変数のみをテストできます(配列内の要素やオブジェクトなどはテストできません)。それらの構文は非常に不格好です。

于 2012-06-24T09:06:54.457 に答える