• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PHPの不等式に変数を使う)

PHPの不等式に変数を使って成り立たせる方法

このQ&Aのポイント
  • PHPの不等式に変数を使うことは可能でしょうか?左辺と右辺の間に変数を用いた不等式を成り立たせたい場合、どのような方法があるのでしょうか?
  • 変数を用いた不等式を成り立たせるためには、一時的に文字列として不等式を組み立てることが効果的です。例えば、変数$cに格納された不等式を解析し、条件分岐することで期待する結果を得ることができます。
  • 具体的な方法としては、strpos()やstrstr()を使って$cの内容を解析し、不等号の種類を特定して条件分岐する方法があります。例えば、$cに'=='が格納されている場合は左辺と右辺が等しいことを判定し、結果を出力するような処理を行うことができます。

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10361)
回答No.5

evalの対象文字列が、すべてプログラム中のリテラルなら問題ないですが、それだとevalを使う意味が無い。そのまま書けば良いので。 evalの対象文字列の一部に、ファイルから読んだ文字列とか、ウェブで送信された文字列とかを含むならば、それらをevalしても安全かどうかを解析しないと、むやみにevalすると何が起こるかわかりません。いわゆる、脆弱性(攻撃されるとファイルを消されたり情報を盗まれたりする)です。 そこまで解析する手間を掛けてevalするくらいなら、質問文中にお書きのように $c を調べてif文で分岐するなどする方がずっと簡単です。

susan-styl
質問者

お礼

なるほどですね、納得です! evalの関数自体には問題がないことが分かったので安心しました。 1.$cはリテラルでないのではないかと仮定した 2.上の場合evalを使うのは乱暴である 初めに回答下さった方は、1番の説明を省略なさっていたので、僕には2番の意味が伝わらなかったのですね。 一応、preg_matchで通ったものを処理しますので 該当部分を悪意のあるユーザーに操作されることはないかと思います。 正規表現でやるか、全条件で分岐するか、あとは好みの問題ですかね。

その他の回答 (4)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

・毎度構文解析、コンパイルするのでパフォーマンスが落ちる。 文法間違いも実行時でないと判断できない。 ・悪意あるコマンドを実行されてしまう脆弱性がある。 ・なにをしているのかがよくわからない。 常に「eval」なので、関数名から直感的に連想しにくい。 eval はどうしても代替手段が無い時にだけにしておいた方がよいです。 例えば、関数compareでも作ってしまえば (中身は > if( strpos($c,'==') !== false && $a == $b){ とかでも構わない) > if(compare($a,$c, $b)){ > echo 'hoge'; > } とevalよりもはるかに直感的で安全なプログラムが書けます。 $cを()の外に出せる無名関数やクラスだと、より「二つの比較」であることがわかりやすくなります。

susan-styl
質問者

お礼

回答くださりありがとうございます notnot様の回答により、 なぜevalが否定されたのかが分かりました! kmee様が挙げてくださいました3つの条件で 2番、3番は僕には当てはまらないようです 僕にとって影響があるのは1番の「パフォーマンスが落ちる」 これが事実の場合はevalを使うのは控えなければなりません evalは特に遅くないという実験結果はあったのですが http://www.softel.co.jp/blogs/tech/archives/84 パフォーマンスが落ちる説明がされている実験結果などはございますでしょうか

回答No.3

まぁほかのコードを変えずに$cの内容に応じて処理を変えたい、ってだけのことなら ふつうは、 http://ideone.com/Rk4ei とか http://ideone.com/iwMX6 とかやるわな。文字列で式を作らなくてもいいんなら (匿名関数の対応がPHP 5.3.0以降なのでPHP 5.2.11のこのサイトでは実行できなかったけど)

susan-styl
質問者

お礼

わざわざコードまで書いていただきありがとうございます 私などの為に時間を割いて頂き深く感謝いたします。 圧倒的に簡単にコードが書けるeval()を教えていただいたのでそちらで行きたいと思います。 別の質問になってしまいますが、教えていただいたコードは、クラスや匿名関数を使っており、このようなソースは読むのが困難であると思うのが一般的だと思います。 本件で、圧倒的に理解しやすいコードが書けるevalを使わず こちらを使ったのにはなにかメリットがあるからなのでしょうか。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

まず文字列の比較に「==」は使いません。 基本を理解しないと後で痛い目にあいます。 そのうえで何のために演算子を変数にしたいのかさっぱりわかりませんが どうしてもというなら乱暴ですがevalを使えばなんとかなります <?PHP $a = 'huga'; $b = 'huga'; $c = '==='; if(eval('return $a '.$c.' $b;')){ echo 'hoge'; } ?>

susan-styl
質問者

お礼

ありがとうございます! evalを使えばいんですね、正にこれが知りたかったです! また、回答で「この方法は乱暴である」と付加情報をお教えいただきましたが 調べたところ、eval()は特に非推奨の関数にはなっていないようですが 具体的にどう乱暴になるのか、つっこんでお教えいただけるとありがたいです。

noname#158634
noname#158634
回答No.1

https://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=php+eval&num=50 ただし、そういう処理を行わなくてはいけない状態になっている時点でそれはクソコードである、という自覚は持っていてください。

susan-styl
質問者

お礼

ありがとうございます。肝に銘じておきます。 これだけの少ない情報で「これはクソコードである」とお教えいただきました 上の回答者様もeval()を使うのは乱暴だと仰っています eval()は特に非推奨の関数にはなっていないようですが eval()を使うことにより「これはクソコードである」というネガティブな判断が下されるのはなぜなのかもお教えいただけると幸いです。

関連するQ&A