質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

2457閲覧

PHP evalと可変変数の違いは何ですか?

KazumiHirata

総合スコア20

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2019/05/15 06:38

可変変数とevalの違いは何がありますか?
使い分ける場面と、その例を教えてほしいです。

https://www.php.net/manual/ja/function.eval.php
https://www.php.net/manual/ja/language.variables.variable.php

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/05/15 06:48 編集

PHPマニュアルを読んだのでしたら実際にサンプルコード組んでみて挙動確認してみては。 そもそも関数(正確にはechoと同じ言語構造)と変数という時点で概念に大きな違いがあるので比較になりません。
guest

回答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

ockeghem

総合スコア11701

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

違い

eval・・・関数(正確には言語構造)
可変変数・・・変数の使い方の1つ

全く違います。一緒くたに考えられる場面のほうが少ないでしょう。
なので「使い分け」という考え方には至りません。

もしかしたら「同じ結果となるコード」を見たのかもしれませんが、
それでしたらそのコードを提示して自身が試したことを記載したうえで分からないことを質問してください。
(evalのほうで調整すれば同じ結果が出せないことはないですがevalって可変変数的な使い方が主ではないですし)

その例

PHPマニュアルにサンプルコードがついています。
例としては十分だと思います。

eval

使わない。

可変変数

有用な場面はあります。
ただ既に回答があるように別のやり方で済むこともあるので最優先で使うということにはなりません。
それも要件次第、ロジック次第でもあるので、PHPマニュアルのサンプルコードをもとに色々試した上で自身の身にしてどこかで使えそうな場面を探ればいいかと思います。

投稿2019/05/15 07:09

m.ts10806

総合スコア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
yambejp

総合スコア114784

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2019/05/15 08:09

受け取るべきパラメータ名がわかっているとき 特殊な処理をかけてユーザーにフィードバックするsampleを追記しておきました ただし前述ましたがこれって$h_xじゃなくて$h["x"]みたいに 配列で受けたほうがやりやすいのでメリットはあまりありません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問