2

PHP がブール式を評価する方法について興味深い質問があります。たとえば、

$expression = $expression1 and $expression2;

また

if ($expression1 and $expression2)

$expression1PHP は最初に、評価結果が かどうかをチェックしtrueます。そうでない場合は、$expression2不要な計算を避けるために単にスキップされます。私が書いているスクリプトには、次のものがあります。

if ($validator->valid("title") and $validator->valid("text"))

$validator->valid("text")最初のステートメントが false と評価された場合でも、2 番目のステートメント ( ) を評価する必要があります。PHP に両方のステートメントを常に評価させる簡単な方法があるかどうかお尋ねしたいと思います。ありがとうございました!

4

6 に答える 6

28
$isValidTitle = $validator->valid("title");
$isValidText = $validator->valid("text");
if($isValidTitle && $isValidText)
{
    ...
}

それは合うでしょうか?

于 2009-04-02T18:12:40.753 に答える
9

これは短絡評価として知られており、これを回避するには、単一の を使用してこれを行う必要があります&

if($validator->valid("title") & $validator->valid("text")) {

}

これは論理演算子ではなく、実際にはビット単位の演算子を使用していることに注意してください。

これらは、数値のバイナリ表現に作用する演算子です。これらは、論理値 (つまり、"true" または "false") を引数として取りません。最初にそれらを数値 1 と 0 に変換する必要があります。また、論理値ではなく数値を返します。確かに、後でこれらの数値を論理値であるかのように扱うことができます (この場合、0 は "false" にキャストされ、それ以外は "true" にキャストされます)。ただし、これは PHP の型キャスト規則の結果であり、何もする必要はありません。オペレーターの行動で。

そのため、この副作用を利用して短絡評価を回避することが適切かどうかについては、いくつかの議論があります。個人的には、& は意図的なものであるというコメントを少なくとも付けたいと思いますが、できるだけ純粋にしたい場合は、まずそれらが有効かどうかを評価してから、if を実行する必要があります。

于 2009-04-02T18:13:55.447 に答える
4

各用語を個別に評価してみてください。

$term1 = $validator->valid("title");
$term2 = $validator->valid("text");
if($term1 && $term2) {
//things to do
}
于 2009-04-02T18:15:38.063 に答える
3

これは最適な実装ではないかもしれませんが、いつでも実行できます。

$a=$validator->valid("title");
$b=$validator->valid("text");
if($a && $b) {...}
于 2009-04-02T18:13:25.947 に答える
1

次のような関数を定義できます。

function logical_and($x,$y) {return ($x && $y);}

PHP は値渡しを使用するため、これは機能します。

于 2010-08-20T10:28:17.347 に答える
0

または、クラス $validator インスタンスを変更できる場合は、有効なメソッドが文字列または配列を受け入れるようにすることができます。配列の場合、各アイテムに既に存在するコードを実行し、すべてのアイテムが「有効」である場合にのみ TRUE を返します。

于 2009-04-02T19:53:16.207 に答える