0

このコードは機能します:

$foo = getFoo();
if (!$foo) $foo = getBar();
if (!$foo) $foo = getJiggy();
if (!$foo) $foo = getWithIt();

私はどこかで論理演算子を使ってそれを単純化したのを見たと思いました:

$foo = (getFoo() || getBar() || getJiggy() || ...);

最初のtrueステートメントが渡されると思いましたが、代わりに、、などの戻り値ではなく、$fooをブール値に設定しているだけですtruegetFoo()getBar()

私が考えているような単純化はありますか?

4

6 に答える 6

5

JavaScriptの場合、演算子には合体動作があるため、foo = bar || baz;は一般的に使用される式です。||

||PHPには、ブール値を返す演算子に関してこの動作はありません。そのため、最初に投稿したより冗長なコード:

$foo = getFoo();
if (!$foo) $foo = getBar();
if (!$foo) $foo = getJiggy();
if (!$foo) $foo = getWithIt();

最も読みやすく、望ましいオプションです。

PHP 5.3には、合体演算子として機能する三項演算子の短縮バージョンがあります。

PHP 5.3以降、三項演算子の中央部分を省略できます。式expr1?:expr3は、expr1がTRUEと評価された場合はexpr1を返し、それ以外の場合はexpr3を返します。

これにより、次を使用できるようになります。

$foo = getFoo() ?: getBar() ?: getJiggy() ?: getWithIt();

ただし、これは互換性について心配する必要がないことを前提としています。

于 2012-10-09T15:38:49.557 に答える
1

あなたが試すことができます

$foo = getFoo() or $foo = getBar() or $foo = getJiggy() or $foo = getWithIt();
var_dump($foo);

出力

string 'Stop Here' (length=9)

使用した機能

function getFoo() {
    return false;
}

function getBar() {
    return false;
}

function getJiggy() {
    return "Stop Here";
}

function getWithIt() {
    return "Hello World";
}
于 2012-10-09T15:38:23.130 に答える
0

ネストされた三項演算子を使用できます。何かのようなもの:

$foo = (!$foo)? getFoo() : ((!$foo)? getBar() : getJiggy()) ;
于 2012-10-09T15:32:03.840 に答える
0

弱い優先順位を使用して、or次のように条件と割り当てのチェーンを構築できます。

    $foo = getFoo()
OR  $foo = getBar()
OR  $foo = getJiggy()
OR  $foo = getWithIt();

読みやすく、他の人がそのような演算子の誤用を理解しやすくするためには、間隔が不可欠です。

于 2012-10-09T15:39:04.947 に答える
0

本当にコードを書き直したい場合は、 call_user_funcを使用できますが、これはあまり洗練されたソリューションではありません。

$foo = false;//best declare vars before using them, to avoid warnings in strict mode
$functions = array('getFoo', 'getBar','getJiggy','getWithIt');
while(!$foo && $func = array_shift($functions))
{
    $foo = call_user_func($func,null);//replace null with optional parameters
}

しかし、ご覧のとおり、これはさらに保守性が低くなります...

于 2012-10-09T15:44:45.407 に答える
-1

試す

($foo = getFoo()) || ($foo = getBar()) || ($foo = getJiggy());
于 2012-10-09T15:32:39.723 に答える