18

多くの場合、PHPでは次のようになります。

$result = mysql_query($query) or die();

orPythonから来て、ブールコンテキストでtrueの場合は最初の値を返し、それ以外の場合は2番目の値を返すため(これを参照) 、これが機能する理由を知っています。

しかし、PHPで上記の手法を別のコンテキストで試してみると、たとえば次のようになります。

$name = "John Doe";
echo $name or "Anonymous";

は最初のor値( "John Doe")を返さず、1を返します。

mysql_query()の結果の場合にこれが機能するのに、他の場合には機能しないのはなぜですか?mysql_query()の場合に使用するのは悪いことですか(ユーザーに有用なエラーを返さないという事実を無視してください)?

4

7 に答える 7

33

PHP では、変数の代入 (等号) と関数の両方がor演算子よりも優先されます。つまり、最初に関数が実行され、次に関数の戻り値がor比較に使用されます。次に、2 つの値/変数を演算子と一緒に使用すると、最初orに 2 つの値が比較され、次にブール値が返されます。

したがって、この例での評価の順序は次のとおりです。

$result = mysql_query($query) or die();
  1. mysql_query($query)
    などの DQL クエリの結果セット、または、、、などの DDL 、SELECTDML、または DCL クエリのブール値を返します。CREATEDROPINSERTUPDATEDELETEALTER

  2. $result = mysql_query($query)
    このクエリの実行結果は、変数に割り当てられます$result

  3. $result /* = ... */ or die();
    それが結果セットまたはのいずれかである場合true、それは true (別名「true」) と見なされるため、or条件が満たされ、ステートメントはここで終了します。die()それ以外の場合は、代わりにスクリプトが実行されます。


echoは言語構造であるため、実際には値を返さないため、or比較が行われる前に関数のように実行されません。

文字列が空ではない$name or "Anonymous"ため常に true であるため、は暗黙的に に変換されるため、その出力になります。"Anonymous"echotrue1

この例での評価の順序は次のとおりです。

$name = "John Doe";
echo $name or "Anonymous";
  1. $name = "John Doe";
    非常に単純です — 文字列John Doeを に割り当てます$name

  2. $name or "Anonymous"
    PHP$nameは文字列John Doeが含まれていることを検出するため、最終的に評価されるのは次のとおりです。

  3. "John Doe" or "Anonymous"
    ここでは少なくとも 1 つの文字列が空でないため、真であると見なされ、条件が満たされます。この評価は を返しますtrue

  4. echo true /* $name or... */;
    数値 1 に変換して出力し ますtrue1

于 2010-07-21T12:13:58.067 に答える
2

Why should or return anything? or is a normal boolean operator. $a or $b is true if either $a or $b evaluates to true and false otherwise.

The difference between || and or is, that or has a lower operator precedance, even lower than =. This is why

$result = mysql_query($query) or die();

is same as

($result = mysql_query($query)) or (die());

whereas

$result = mysql_query($query) || die();

is same as

$result = (mysql_query($query) || die());

In your case

echo $name or "Anonymous";

gets

(echo $name) or ("Anonymous");

What you are looking for probably is the ternary operator:

echo $name ?: 'Anonymous';

The above will work as of PHP 5.3, if you have only PHP 5.2 use:

echo $name ? $name : 'Anonymous';
于 2010-07-21T12:15:37.327 に答える
2

その理由は、質問をした直後に実際に思い浮かびました。演算子の優先順位についてです。はの=前に発生するため、次のorようになります。

$result = mysql_query($query) or die();

次と同等です。

($result = mysql_query($query)) or die();

いいえ:

$result = (mysql_query($query) or die());

Python の場合と同様です。したがって、この:

$a = false or true;

true ではなく、false に設定さ$aれます。これは、将来のある時点で私を捕まえるに違いありません。

于 2010-07-21T12:34:07.337 に答える
1

PHP does something often called "type juggling". In other words: PHP transforms the type of any value for the current use case. Since Strings will be transformed to "true" values, your expression returns true. But echo wants to print an string expression and transforms "true" to 1. Kinda annoying in some cases, but if you know it, you also know how to handle ;)

Check this out, by the way: http://php.net/manual/en/types.comparisons.php

于 2010-07-21T12:15:42.540 に答える
1

the or clause is evaluated first and returns a boolean which the echo outputs. If you want to output text you need a if/else construct like:

echo ($name ? $name : 'Anonymous');
于 2010-07-21T12:16:34.197 に答える
0

これは、echoが関数ではなく、言語構造であるためです。関数のように見えますが、実際にはそうではありません :)

私はこのように die() を使用することはありません。ただ救済するのではなく、エラーを適切に処理する必要があります。

于 2010-07-21T12:13:22.543 に答える
0

その動作を複製し、画面/ブラウザーに出力したい場合は、TRUE 以外の値を返す関数が必要です。printf() はそれを行うことができます。

echo microtime."&lt;br&gt;";<
$str = "";
printf("%s",$str) or die();
echo "&lt;br&gt;".microtime();

$str が空、null、または false の場合、die() が呼び出されます。それ以外の場合、スクリプトは実行を終了します。

于 2010-07-21T13:27:43.547 に答える