6

私はphp.netの演算子の優先順位セクションを調べていて、この例に出くわしました

$a = 1;
$b = null;
$c = isset($a) && isset($b);
$d = ( isset($a) and isset($b) );
$e = isset($a) and isset($b);
var_dump($a, $b, $c, $d, $e);
//Result:
int(1)
NULL
bool(false)
bool(false) <== I get this
bool(true)  <== I do not get this

コード内のどこにいるかを追跡するために、コード内で非常に多くのデバッグおよび詳細な print(_r) ステートメントを使用します。$debug and print_r($dataArray)そのため、コード間でorを別のステートメントとして使用$verbose and print "Updating dataArray\n"して、これらの print(_r) ステートメントを制御できるようにしています。これは、多くの[[ $condition ]] && { #Do if true } || { #Do if false }. BASH では、それらが短絡していることを知っていたので、この事実を利用して多くの単純なワンライナーを書きました。
今、私はこの(書くことの)練習の多くが私の声明$verbose and printにゆっくりと忍び寄っていることを観察しています. これは推奨される方法ではなく、背中を噛まれる可能性があるifことは承知しています。しかし、私はこのようなワンライナーを書くのが好きで、自分のスタイルとして使いたいので、このスキルをマスターしたいと思っています.

だから私の質問は(ある)です:

  1. 短絡している演算子 (&&または) はどれですか?and
  2. マニュアルには&&よりも優先されると書かれていますandが、短絡した演算子の機能/機能/特性と演算子の優先順位を組み合わせることで、誰かがこれを例示できます。(基本的には優先順位とショートサーキットの組み合わせ)

演算子の短絡と戻り値の性質の両方について詳しく説明してください。

PS: 1. これらの演算子の結合性が同じで直感的であることを願っていますが、何か癖があれば教えてください。
PS: 2. そのような慣習の危険性について私に警告したい場合は、親切に例を含めてください。

編集:単純な$var = mysql_(...) or die()コードを に置き換えorて変更した後、 andの代わりにand演算子||を使用するのがいかに厄介であるかを発見しました。コードは単に機能しませんでした! 私の理解では、前者の構造はorの戻り値を に代入し、それが警告/エラー/予期しない動作を生成するために を順次使用します。後者の構文は、最初に の結果を代入し、次に と の複合を評価します。 これは私にとって良い教訓です。1. PDO/mysqli の使用を開始し、自分でエラーを処理します 2. 上記で個人的なスタイルとして呼び出したものを書く前によく考えてください||&&andorTRUEFALSE$var$varmysql_(...)$var=die
.
//自分へのメモ : あるスクリプト言語やインタープリター言語の経験を別の言語で書いているときに使用しないでください。それぞれがユニークで、独自の癖や落とし穴があります。

4

1 に答える 1

7

コード

$e = isset($a) and isset($b);

と同じように解析されます

($e = isset($a)) and isset($b);

したがって、と割り当て$eによって決定されるように、 は評価から独立しています。isset($a)trueisset($b)

于 2011-08-08T09:56:52.900 に答える