• ベストアンサー

条件式の中で変数を含んだ文字列を使うには?

if文の条件式を追加書きしたくて悩んでいます。 if($data1==1){ echo 'ほにゃららら'; } 例えば、この条件『$data1==1』に『$data2==1』を追加する場合 『&& $data2==1』を$hensuに格納して条件式に追加する事はできますか? またどう書けばよいのでしょうか? 思いつく範囲で試したり調べましたが中々期待通りに動きません。 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#244856
noname#244856
回答No.3

えっと・・・ 「式自体は(またはその一部分は)先に定義しておきたい」 「しかし評価されるタイミングは遅延させたい」 ということでしょうか?あんまり使わない方がいいですが、一応eval命令が使えますね。関数のように見えますがこれは言語構造です。 eval http://php.net/manual/ja/function.eval.php 質問の意図に合っているかどうか分かりませんが、こんな感じでしょうか。式が評価されては困る部分は必ずダブルクオートではなくシングルクオートを使ってください。 【テストコード】 <?php $data1 = 1; $data2 = 0; $exp1 = '$data1 === 1'; $exp2 = 'and $data2 === 1'; if (eval("return {$exp1} {$exp2};")) { echo 'ほにゃららら'; } もう一度いいますが、非常に特殊なケースを除けばeval命令なんて使わずともまともなプログラムは組めるはずです。本当にこうする必要があるかどうか十分に検討してください。(差支えない範囲で問題となっているコードを提示して頂ければ添削します。)

noname#217950
質問者

お礼

こんなのもあったんですね。 To_aru_Userさんが言われる通りあまり使いたくない感じですね~。 これが出来たら楽だなぁと思いましたが、他の方法にする事にしました。ありがとうございました。

その他の回答 (2)

  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.2

私なら $hensu=$data1==1&$data2==1; if($hensu){ echo 'ほにゃららら'; } と書きたいですね。 条件判定の中で代入はしたくないですねえ。

noname#217950
質問者

お礼

ありがとうございました。

noname#217950
質問者

補足

$hensuがTRUEという事で条件は関係なく全て実行してしまいませんか?

noname#244856
noname#244856
回答No.1

・演算子の優先順位の説明をしたいので、$data2ではなく$data1の方を説明対象にします。 ・個人的にPHP独特の「緩やかな比較」を行う「==」「!=」は嫌いなので「===」「!==」を用いて説明します。 「==」「!=」演算子の予想外な挙動 http://www.php.net/manual/ja/language.operators.comparison.php あらかじめチェックしておいた結果を条件式に入れたいのであれば $check = $data1 === 1; if ($check && $data2 === 1) { echo 'ほにゃららら'; } 条件式の中でチェックを行い、結果の代入も同時に行いたいのであれば if (($check = $data1 === 1) && $data2 === 1) { echo 'ほにゃららら'; } となります。 比較演算子「==」「!=」「===」「!==」は「True」「False」のどちらかの値を返します。 代入演算子「=」は代入した値を返します。 【発展1: 演算子の優先順位】 高い順に == != === !=== & (副作用完了点無し) | (副作用完了点無し) && (副作用完了点有り) || (副作用完了点有り) = and (副作用完了点有り) or (副作用完了点有り) 個人的には「&&」「||」よりも「and」「or」の方がどちらかと言えばお勧めです。 代入演算子より優先度が低いことで得られる恩恵は結構大きいです。 (私も最近こちらに乗り換えました) 上記の2番目の例であれば if ($check = $data1 === 1 and $data2 === 1) { echo 'ほにゃららら'; } のようにまるまる1つカッコを外すことが出来ます。 【発展2: 演算子の優先度の変化】 「!== false」 V.S. 「false !==」 http://qiita.com/mpyw/items/b097da196baf47e58ed9 もし「$data」を「$check」に代入して同時に「1」と等しいかをチェックしたい場合、 if ((($check = $data1) === 1) && $data2 === 1) { echo 'ほにゃららら'; } または if (($check = $data1) === 1 and $data2 === 1) { echo 'ほにゃららら'; } となると思いますが、実はもう1つカッコを外すことが出来ます。 if (1 === $check = $data1 and $data2 === 1) { echo 'ほにゃららら'; } 詳しくはこちらで。 http://qiita.com/mpyw/items/b097da196baf47e58ed9

noname#217950
質問者

お礼

ありがとうございました。

noname#217950
質問者

補足

条件式を直接書けば期待通りに動く状況です。条件式そのものを変数にした時に、その変数が真か偽かで判定されてしまいうまく動かないようです。たんなる文字列として条件式に変数に格納した文字列を連結できないでしょうか?

関連するQ&A