2011-08-08 12 views
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 

は、私はデバッグのかなり多くを使用すると言うthis exampleに出くわしました。冗長なprint(_r)文を私のコードに入れて、私がコード内のどこにいるかを記録しておきます。だから私は$debug and print_r($dataArray)または$verbose and print "Updating dataArray\n"をコード間の別のステートメントとして使用して、これらのprint(_r)ステートメントを制御できるようにします。これはBASHの経験から来たもので、私は[[ $condition ]] && { #Do if true } || { #Do if false }をたくさん書いていました。 BASHでは、私はそれらが短絡していることを知っていて、この事実を使って多くの単純なライナーを書きました。
今私はこの書面($verbose and printを書く)の多くがゆっくりと私のifのステートメントに入っているのを観察しています。私はこれがであることを承知しています。の練習ではなく、のバックで私を噛むことができます。しかし、私はそのようなライナーを書くことを楽しむようにこのスキルを習得したいと私は個人的なスタイルとしてそれを使用したいと思います。

だから私の質問(複数可)(ある)されています。短絡されるオペレータ(&&またはand

  1. マニュアルではandよりも優先すると言われていますが、短絡したオペレータの機能/機能/特性をオペレータの優先順位と混在させることで、これを例示することができます。 (基本的には優先順位と短絡の混合と一致)

オペレータの短絡と戻り値の両方の性質について丁寧に説明します。

PS:1.私は、これらの演算子の連想性は同じで直感的であることを望みますが、任意の癖を知っているなら、私に教えてください。
PS:2.そのような練習の危険に対して私に警告する気が残っている場合は、例を付けてください。

EDIT:||orを置き換えることによって、私の簡単な$var = mysql_(...) or die()コードを変更した後、私はそれが代わりにandor||&&演算子を使用することができますどのように迷惑な発見。 コードは単に動作しませんでした!私の理解では、前のコンストラクトはTRUEまたはFALSEの戻り値を$varに割り当て、これはすべて$varを順番に使用して警告/エラー/予期しない動作を生成します。後者のコンストラクトはmysql_(...)の結果を最初に$varに割り当て、次いで=およびdieの化合物を評価する。
これは良いレッスンです。1. PDO/mysqliを使い始めて、自分でエラーを処理してください。私はという個人的なスタイルと呼んでいます。自己への
は//注:/解釈言語別のコードを書きながら、それぞれがユニークであり、独自の癖や落とし穴を持っている、とのthatsちょうど悲しい*ため息*

+0

[参考 - このシンボルはPHPで何を意味しますか?](http://stackoverflow.com/questions/3737139/reference-what-this-symbol-mean-in-php) – Gordon

+0

@Gordon :_ありがとうございました。私はリストをチェックしましたが、いくつかの質問は質問の一部に答えているようです(私がすでに知っていた優先順位のようなもの)。 IMHOでは、演算子の優先順位と短絡の性質について詳しくは説明しません。 – Sudhi

+0

例リンクのコメントの作成者は、ANDキーワードが等価の後に評価されていることを示す演算子の優先順位を示しています。それは奇妙に思えますが、いくつかのスクリプトが使用する 'mysql_connect(...)またはdie()'の行を思い出させます。 –

答えて

7

コード1つのスクリプティングの経験を使用していませんevaluatiの独立 - isset($a)と割り当てによって決定されるよう

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

は、したがって

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

$eと同じように解析され、trueありますng isset($b)

+1

これは明らかに:短絡には関係しません。 –

+0

@Felix:PHPで短絡について書いたり、説明したり、詳しく説明したりできますか?私は特に短絡後に生成される戻り値について心配しています。 – Sudhi

+1

@Sudhi:あなたが私に何を書いていいのか分かりません。これらの演算子( '&&'、 '||'、 'and'、 'または')はすべて短絡しています...戻り値は常にブール値です。 –

関連する問題