Evalとは? わかりやすく解説

eval

(PHP 4, PHP 5)
eval — 文字列を PHP コードとして評価する

説明

mixed eval ( string code_str )
eval() は、code_str で与えられた文字列を PHP コードとして評価します。 中でも、データベースのテキストフィールドにコードを保存し、 後で実行するためには便利です。 code_str には contain PHP 開始タグを含める必要はありません。
eval() を使用する際、注意するべき点が いくつかあります。 パーサが eval() の処理中に落ちないように、 渡す文字列はセミコロンで文が終了するといった有効な PHP コード である必要があります。また、code_str の 中の文字を適切にエスケープする必要があります。 HTML 出力と PHP コードを一緒に使用するために、 PHP 終了タグを使用して PHP モードを抜けることが可能です。
eval() の中で値を与えた変数は、 この後、メインスクリプトの中でもこれらの値を維持することも 覚えておいてください。
return 文は、文字列の評価をただちに終了します。 PHP 4 では、評価されるコードの中で return が コールされない限り、eval()NULL を返します。 return がコールされた場合は、その値を返します。 評価されるコードの中でパースエラーが発生した場合は、 eval()FALSE を返します。 評価されるコードの中で致命的なエラーが発生した場合は、 スクリプト全体が終了します。 PHP 3 では、eval() は値を返しません。
例 1253. eval()の例 - 簡単なテキストのマージ
<?php
$string = 'cup';
$name = 'coffee';
$str = 'This is a $string with my $name in it.';
echo $str. "\n";
eval("\$str = \"$str\";");
echo $str. "\n";
?>
上の例の出力は以下となります。

This is a $string with my $name in it.
This is a cup with my coffee in it.

      


ティップ

ブラウザに直接結果を出力する すべてのものと同様に、出力制御関数 を使用してこの関数の出力をキャプチャーし、(例えば)文字列 (string)に保存することが可能です。
call_user_func() も参照ください。

Eval クラス


Eval メソッド


Eval メンバ


eval

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/11/24 02:36 UTC 版)

ナビゲーションに移動 検索に移動

eval(イーバル)はいくつかのプログラミング言語が持つ、文字列として評価(evaluate)する関数、または複数のプログラム中のあるコンテキストで実行するサブルーチンである。

evalの類の機能はコンパイラ言語よりもインタプリタ言語でより一般的である。なぜならコンパイラ言語でこのような機能を実現するには、プログラム自体に言語処理系や(変数名などの)実行時情報を埋め込む必要があるからである。evalに近い機能を実現しているコンパイラ言語も存在する。

セキュリティ上のリスク

信頼されないソースからのデータをevalするときには特に注意が必要である。例としてインターネット上からデータを得る get_data() 関数を考える。次の擬似コードのようなプログラムは潜在的に危険である。

data = get_data()
foo = eval(data)

攻撃者がこのプログラムに例えば "delete_system_files()" という文字列を与えることができると、delete_system_files() 関数が実行されてしまい、重要なファイルが消されてしまうかもしれない。これを防ぐためには、evalされる文字列はすべてエスケープしたり、潜在的に危険な機能を利用できないようにして実行するなどの対策が必要となる。プログラミング言語によっては、外部から入力されたデータを「汚染されている」として印をつけるものもある。

適切な使用

evalは非常に強力なため、経験の浅いプログラマは何でもevalを使って済ませてしまうことがある。たいてい、そのような場合には専用のより良い選択肢が存在し、コードのパースにかかる時間が節約できる。

例えば、evalは簡易テンプレートエンジンとして使われることがある。PHPでの例を示す。

$name = 'John Doe';
$greeting = 'Hello';
$template = '"$greeting,  $name! How can I help you today?"';
print eval("return $template;")

この例は期待した動作をするが、前述のようにセキュリティ上の問題を抱えており、他の方法よりもはるかに遅い。より高速で安全な方法は単に "$name" という文字列を $name の値で置換することである。

eval は表計算ソフトなどの数式を評価する必要のあるアプリケーションで使われることがある。これは数式のパーサを自作するよりも手軽だが、自作や既存の専用のパーサを利用するほうがより良い。前述の問題点に加え、言語組み込みのevalはアプリケーション用にカスタマイズできないからである。

おそらく、evalの最も優れた使い道は(LISPなどでの)処理系のブートストラップや、言語の対話的な実行環境でユーザが書いたプログラムを実行することであろう。

実装

インタプリタ言語ではevalは通常のコードと同じインタプリタで実装されるのがほとんどである。

コンパイラ言語ではevalを実装するために通常のコンパイラをプログラムに埋め込むこともある。また特別のインタプリタを使うこともあり、その場合はコードの重複が問題となる。

実例

JavaScript, ActionScript

JavaScriptActionScriptにおいては、evalは式の評価器と文の実行器のハイブリッドのような存在である。evalは最後に評価された式の値を返し(JavaScriptとActionScriptではすべての文は式である)、最後のセミコロンは省くことができる。

式評価器としての例:

foo = 2;
alert(eval('foo + 2'));

文実行器としての例:

foo = 2;
eval('foo = foo + 2;alert(foo);');

JavaScriptでのevalの使用の一例はAjaxなどにおけるJSONのパースである。しかし、現在は多くのブラウザでより特化したJSON.parseが定義されている。

ActionScriptではevalを任意の式を評価するために使うことはできない。Flash 8のドキュメントによれば、その使用は「変数、プロパティ、オブジェクト、ムービークリップの名前」を表す式に限られ、「パラメータはStringまたはオブジェクトのインスタンスへの直接の参照のどちらでもよい」[1]

LISP

LISPevalが最初に登場した言語である。evalの実装によって、最初のLISPインタプリタが現れたのである。それ以前は、LISPの式はコンパイルされていた。しかし一度evalが実装されると、それは単純な入力・評価・出力のループ (REPL) の一部として使われるようになり、最初のLISPインタプリタの基礎を形作った。LISPの後のバージョンのevalはコンパイラとしても実装されている。

Perl

Perlのevalは、文字列をプログラムとして解釈するほか、例外処理機構としても機能する。コードの塊をテストし、必要ならそれに関して警告することができる。例えば、除算において実行時エラーが発生すると$@で警告を出力することができる。

# 0による除算の例外を回避する
eval { $answer = $x / $y; };
warn $@ if $@;

PHP

PHPでのevalは、ほぼ、文字列中のコードをまるで eval() 呼び出しの代わりにファイル中に記述されているかのように実行する。例外は、エラーは eval() から復帰した時点で報告され、またreturn文で eval() の戻り値を返すことができる点である。

echoを使った例:

<?php
$foo = "Hello, world!\n";
eval('echo $foo;');
?>

値を返す例:

<?php
$foo = "Goodbye, world!\n";
echo eval('return $foo;');
?>

PostScript

PostScriptexec演算子はオペランドを1つ取り、それが単純なリテラルならスタックにプッシュし返す。PostScriptの式を含む文字列が来た場合は、その文字列をインタプリタによって実行可能な形式に変換する。例えば、

 ((Hello World) =) cvx exec

は PostScript の式である (Hello World) =(文字列 Hello World をスタックからポップして画面に表示する)を実行可能な型を持つように変換し、そして実行する。

PostScriptでは run 演算子も似た機能を持つが、代わりにインタプリタそのものがファイル中のPostScriptの式を評価する。

Python

Pythonでの eval 関数は単一の式を評価する。文を実行することはできないが、文を実行する関数を実行することはできる。exec 文は文を実行することができる。

eval の例(対話モード):

>>> x = 1
>>> eval('x + 1')
2
>>> eval('x')
1

exec の例(対話モード):

>>> x = 1
>>> y = 1
>>> exec "x += 1; y -= 1"
>>> x
2
>>> y
0

ColdFusion

ColdFusionevaluate 関数は文字列で与えられた式を実行時に評価することができる。

<cfset x = "int(1+1)">
<cfset y = Evaluate(x)>

これは読み込む変数をプログラム的に選択するときなどに、特に便利である。

<cfset x = Evaluate("queryname.#columnname#[rownumber]")>

Ruby

Rubyには式を評価するコンテキストごとに3種類のevalが存在する。eval はその場またはProcやBindingオブジェクト、instance_eval はインスタンス、module_eval(別名はclass_eval)はモジュールかクラス、それぞれのコンテキストで評価を行う。なお、評価コンテキスト変更のためにinstance_evalmodule_evalを使う場合、文字列でなくブロックを引数とすることができる[2]

evalの例(メソッドfooのコンテキストで評価している):

def foo
  x = 1
  binding
end

eval('x + 1', foo) #=> 2

instance_evalmodule_eval の例:

class Bar
@@cvar = 10 #クラス変数
  def initialize
    @ivar = 5 #インスタンス変数
  end
end

bar = Bar.new
bar.instance_eval('@ivar') #=> 5
Bar.class_eval('@@cvar') #=> 10

脚注

[脚注の使い方]
  1. ^ Adobe - Flash 8 LiveDocs
  2. ^ instance method BasicObject#instance_eval - Ruby1.9.3リファレンスマニュアル

外部リンク


EVAL(node)

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2017/09/03 13:47 UTC 版)

最良優先探索」の記事における「EVAL(node)」の解説

ノード評価関数ヒューリスティクスとしてノードからゴールまでの近さ数値返す関数。EVAL(node1, node2) という形で node1 と node2 のどちらがゴールに近いかを判定する関数でも良い

※この「EVAL(node)」の解説は、「最良優先探索」の解説の一部です。
「EVAL(node)」を含む「最良優先探索」の記事については、「最良優先探索」の概要を参照ください。

ウィキペディア小見出し辞書の「Eval」の項目はプログラムで機械的に意味や本文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。 お問い合わせ



固有名詞の分類


英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「Eval」の関連用語

Evalのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



Evalのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
PHP Documentation GroupPHP Documentation Group
Copyright © 1997 - 2025 by the PHP Documentation Group.
日本マイクロソフト株式会社日本マイクロソフト株式会社
© 2025 Microsoft.All rights reserved.
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアのeval (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。
ウィキペディアウィキペディア
Text is available under GNU Free Documentation License (GFDL).
Weblio辞書に掲載されている「ウィキペディア小見出し辞書」の記事は、Wikipediaの最良優先探索 (改訂履歴)、焼きなまし法 (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。

©2025 GRAS Group, Inc.RSS