可変変数とevalの違いは何がありますか?
使い分ける場面と、その例を教えてほしいです。
https://www.php.net/manual/ja/function.eval.php
https://www.php.net/manual/ja/language.variables.variable.php
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
可変変数よりもevalの方が汎用的なので、evalを使えば、可変変数に近いことができます。
例えば、可変変数を使った以下のサンプルは…
$x = 1; $a = 'x'; echo $$a; // echo $x; が実行されたのと同じで 1 が表示される
evalを使うと以下のように書けます。
<?php $x = 1; $a = 'x'; eval('echo $' . $a . ';'); // 文字列連結の結果 eval('echo $x;') が実行され、1が表示される
では、evalだけあれば事足りるかというと、既に指摘があるように、evalは危険すぎるという問題があります。
以下のサンプルを御覧ください。
<?php $x = 1; $a = 'x; system("cat /etc/passwd")'; // $a に攻撃文字列を指定された eval('echo $' . $a . ';');
evalで実行されるスクリプトは下記のものです。
eval('echo $x; system("cat /etc/passwd");');
すなわち、1が表示された後、cat /etc/passwdが実行されます。比較的無害なサンプルを選択しましたが、ファイルを改ざんしたり、重要上の漏洩等の攻撃ができることになります。
このように、evalは使い方がとても難しく、しくじった場合の被害が大きすぎるので、通常は「使用禁止」とするべきです。
ならば、可変変数ならば安全かというと、evalほどではないにしても、予期しない変数の値が表示されたり、値を書き換えられたりする可能性があります。なので、通常は「使用禁止」とするべきかと思います。
なので、「使い分ける場面」というご質問ですが、「どちらも通常は使わない」ということですね。
投稿2019/05/15 07:55
総合スコア11701
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
違い
eval・・・関数(正確には言語構造)
可変変数・・・変数の使い方の1つ
全く違います。一緒くたに考えられる場面のほうが少ないでしょう。
なので「使い分け」という考え方には至りません。
もしかしたら「同じ結果となるコード」を見たのかもしれませんが、
それでしたらそのコードを提示して自身が試したことを記載したうえで分からないことを質問してください。
(evalのほうで調整すれば同じ結果が出せないことはないですがevalって可変変数的な使い方が主ではないですし)
その例
PHPマニュアルにサンプルコードがついています。
例としては十分だと思います。
eval
使わない。
可変変数
有用な場面はあります。
ただ既に回答があるように別のやり方で済むこともあるので最優先で使うということにはなりません。
それも要件次第、ロジック次第でもあるので、PHPマニュアルのサンプルコードをもとに色々試した上で自身の身にしてどこかで使えそうな場面を探ればいいかと思います。
投稿2019/05/15 07:09
総合スコア80850
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
- evalは文字列をソースとして実行する処理なのでセキュリティ上課題が多い
- 可変変数は単に変数の中身をつかって新しい変数を作る仕組み
ただ、大抵の場合配列で処理すれば済む場合が多い
可変変数のsample
PHP
1foreach(["x","y","z"] as $val){ 2 $$val=filter_input(INPUT_POST,$val); 3 ${"h_".$val}=htmlspecialchars($$val); 4} 5print_r([$x,$y,$z]); 6print <<<eof 7<form method="post"> 8x:<input type="text" name="x" value="{$h_x}"><br> 9y:<input type="text" name="y" value="{$h_y}"><br> 10z:<input type="text" name="z" value="{$h_z}"><br> 11<input type="submit" value="go"> 12</form> 13eof;
投稿2019/05/15 06:42
編集2019/05/15 08:08総合スコア114784
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。