6

私はしばしば、次の論理パターンでコードを書く必要があることに気づきます。

$foo = isset($bar) ? $bar : $baz;

?:私は構文について知っています:

$foo = $bar ?: $baz;

...表面上、これは私が探しているもののようです。ただし、が設定されていない場合は、未定義の通知インデックスがスロー$barされます。また、と同じロジックを使用しますempty()。つまり、、、などの「空の」値はFALSE渡されません。したがって、それは実際には同等ではありません。0"0"

が設定されていないときに通知をスローせずにそのコードを書くためのより短い方法はあり$barますか?

編集:

ショートカット構文を探している理由をもう少し明確にするために、より良い例を次に示します。

$name = isset($employee->getName())
      ? $employee->getName()
      : '<unknown>';

この場合、$employeeはサードパーティライブラリのオブジェクトである可能性があり、それがである可能性があるのは有効なシナリオであるname可能性がありますNULL。返された名前(存在する場合)に変数を設定したいの$nameですが、存在しない場合はいくつかの賢明なデフォルトがあります。

メソッド呼び出しが単なるゲッターよりも複雑な場合、結果をキャッシュする必要があるため、例はさらに冗長になります。

$bar = $some->reallyExpensiveOperation();
$foo = isset($bar) ? $bar : $baz;
4

3 に答える 3

3

変数を明示的に事前定義するか、マジックゲッターでオブジェクトを使用する場合にのみ、短縮形の3値構文を使用します。これは、私が通常、速記の3値構文を使用する非常に基本的な例です。

class Foo {
    public function __get($name) {
        return isset($this->{$name}) ? $this->{$name} : '';
    }
}

$foo = new Foo();
$bar = $foo->baz ?: 'default';
于 2012-07-21T02:14:30.933 に答える
0

エラー制御演算子を使用すると、技術的に次のように短縮できます。

$foo = @$bar ?: $baz;

が設定されていない場合$bar、値はnullと評価され、エラーを抑制したため、エラー通知は表示されません。@ただし、このコードはエラーをマスクし、デバッグをより困難にするため、使用するのが適切ではないため、このコードを承認しない場合があります。

それがなければ、いいえ、単にを使用するより短い表記があるとは思いませんisset

編集:@drrcknlsnで指摘されているように、変数が、、、falseまたはである0場合null、これは機能しないため、の呼び出しを回避することはできないように思われますisset

于 2012-07-21T02:03:55.177 に答える
0

が定義されていない場合$bar、同じコードを書くための「より短い」方法は実際にはありません。

私がそれを行うための「ハック」と考えるものは2つありますが、他のものにも影響を与える可能性があります。

  1. でのエラー調整@など、$foo = @$bar ?: $baz;必要な処理を正確に実行し、未定義の場合にスローされるundefined-errorを調整します$bar。定義されている場合は、必要に応じて機能します。ただし、欠点は、@コードを繰り返し使用すると、コードの効率が低下する可能性があることです。
  2. で通知をオフにし error_reporting(E_ALL & ~E_NOTICE);ます。これにより、通常のエラーはすべて表示されますが、通知は表示されないため、「変数は未定義です」エラーが効果的に非表示になります。これの欠点は、他の通知が表示されないことです。

さて、私の義務的な個人的な意見ですが、私はそれを完全に書き続けることを提案します。三項演算子はすでに省略形であり、以下を効果的に削減します。

if (isset($bar)) {
    $foo = $bar;
} else {
    $foo = $baz;
}

はるかに短い

$foo = isset($bar) ? $bar : $baz;

そして、完全な3値を書くのに、短い3値を書くのに、それほど多くの労力はかかりません(もちろん、変数名が途方もなく長い場合を除きます)。また、複合三項演算(つまり、1つに複数の三項)があり、余分な速記が使用できなくなる場合が少なくありません。したがって、短期間の節約はプログラム的/道徳的に満足のいくものではありません(私自身の意見では)。

更新:$bar関数の戻り値に割り当て、それに基づいて編集をサポートするには$foo、次のようにステートメントを1行にまとめることができます。

$foo = (($bar = $some->reallyExpensiveOperation()) != null) ? $bar : $baz;

これは2行とほぼ同じコード長ですが、ここから少し短くすることもできます。たとえば、それnullが「無効」と見なされる唯一の値ではなく、falseカウントされる場合は、その!= null部分を完全に削除して、条件を単純なブール値として処理できるようにすることができます。

$foo = ($bar = $some->reallExpensiveOperation()) ? $bar : $baz;

この例で$barは、三項演算後もアクセス可能です(つまり、スコープが失われることはありません)。したがって、変数に対して前処理を行う必要がない限り、このメソッドには、読みやすさ以外に大きな欠点はありません。

于 2012-07-21T03:15:47.447 に答える