uTools-Manuals/docs/php/eval.html
2019-04-28 19:00:34 +08:00

140 lines
7.3 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>把字符串作为PHP代码执行</title>
</head>
<body class="docs"><div id="layout">
<div id="layout-content"><div id="function.eval" class="refentry">
<div class="refnamediv">
<h1 class="refname">eval</h1>
<p class="verinfo">(PHP 4, PHP 5, PHP 7)</p><p class="refpurpose"><span class="refname">eval</span> &mdash; <span class="dc-title">把字符串作为PHP代码执行</span></p>
</div>
<div class="refsect1 description" id="refsect1-function.eval-description">
<h3 class="title">说明</h3>
<div class="methodsynopsis dc-description">
<span class="methodname"><strong>eval</strong></span>
( <span class="methodparam"><span class="type">string</span> <code class="parameter">$code</code></span>
) : <span class="type"><a href="language.pseudo-types.html#language.types.mixed" class="type mixed">mixed</a></span></div>
<p class="para rdfs-comment">
把字符串 <code class="parameter">code</code> 作为PHP代码执行。
</p>
<div class="caution"><strong class="caution">Caution</strong>
<p class="para">
函数<span class="function"><strong>eval()</strong></span>语言结构是 <em class="emphasis">非常危险</em>的,
因为它允许执行任意 PHP 代码。 <em class="emphasis">它这样用是很危险的。</em>
如果您仔细的确认过,除了使用此结构以外
别无方法, 请多加注意,<em class="emphasis">不要允许传入任何由用户
提供的、未经完整验证过的数据</em>
</p>
</div>
</div>
<div class="refsect1 parameters" id="refsect1-function.eval-parameters">
<h3 class="title">参数</h3>
<p class="para">
<dl>
<dt>
<code class="parameter">code</code></dt>
<dd>
<p class="para">
需要被执行的字符串
</p>
<p class="para">
代码不能包含打开/关闭
<a href="language.basic_syntax.phpmode.html" class="link">PHP tags</a>。比如,
<em>&#039;echo &quot;Hi!&quot;;&#039;</em> 不能这样传入:
<em>&#039;&lt;?php echo &quot;Hi!&quot;; ?&gt;&#039;</em>。但仍然可以用合适的 PHP tag 来离开、重新进入 PHP 模式。比如
<em>&#039;echo &quot;In PHP mode!&quot;; ?&gt;In HTML mode!&lt;?php echo &quot;Back in PHP mode!&quot;;&#039;</em>
</p>
<p class="para">
除此之外,传入的必须是有效的 PHP 代码。所有的语句必须以分号结尾。比如
<em>&#039;echo &quot;Hi!&quot;&#039;</em> 会导致一个 parse error
<em>&#039;echo &quot;Hi!&quot;;&#039;</em> 则会正常运行。
</p>
<p class="para">
<em>return</em> 语句会立即中止当前字符串的执行。
</p>
<p class="para">
代码执行的作用域是调用 <span class="function"><strong>eval()</strong></span> 处的作用域。因此,<span class="function"><strong>eval()</strong></span> 里任何的变量定义、修改,都会在函数结束后被保留。
</p>
</dd>
</dl>
</p>
</div>
<div class="refsect1 returnvalues" id="refsect1-function.eval-returnvalues">
<h3 class="title">返回值</h3>
<p class="para">
<span class="function"><strong>eval()</strong></span> 返回 <strong><code>NULL</code></strong>,除非在执行的代码中 <em>return</em> 了一个值,函数返回传递给 <em>return</em> 的值。 PHP 7 开始,执行的代码里如果有一个 parse error<span class="function"><strong>eval()</strong></span> 会抛出 ParseError 异常。在 PHP 7 之前,
如果在执行的代码中有 parse error<span class="function"><strong>eval()</strong></span> 返回
<strong><code>FALSE</code></strong>,之后的代码将正常执行。无法使用 <span class="function"><a href="set_error_handler.html" class="function">set_error_handler()</a></span> 捕获 <span class="function"><strong>eval()</strong></span> 中的解析错误。
</p>
</div>
<div class="refsect1 examples" id="refsect1-function.eval-examples">
<h3 class="title">范例</h3>
<p class="para">
<div class="example" id="example-4534">
<p><strong>Example #1 <span class="function"><strong>eval()</strong></span> 例子 - 简单的文本合并</strong></p>
<div class="example-contents">
<div class="phpcode"><pre><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br />$string&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">'cup'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$name&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">'coffee'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$str&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">'This&nbsp;is&nbsp;a&nbsp;$string&nbsp;with&nbsp;my&nbsp;$name&nbsp;in&nbsp;it.'</span><span style="color: #007700">;<br />echo&nbsp;</span><span style="color: #0000BB">$str</span><span style="color: #007700">.&nbsp;</span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br />eval(</span><span style="color: #DD0000">"\$str&nbsp;=&nbsp;\"</span><span style="color: #0000BB">$str</span><span style="color: #DD0000">\";"</span><span style="color: #007700">);<br />echo&nbsp;</span><span style="color: #0000BB">$str</span><span style="color: #007700">.&nbsp;</span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</pre></div>
</div>
<div class="example-contents"><p>以上例程会输出:</p></div>
<div class="example-contents screen">
<div class="cdata"><pre>
This is a $string with my $name in it.
This is a cup with my coffee in it.
</pre></div>
</div>
</div>
</p>
</div>
<div class="refsect1 notes" id="refsect1-function.eval-notes">
<h3 class="title">注释</h3>
<blockquote class="note"><p><strong class="note">Note</strong>: <span class="simpara">因为是一个语言构造器而不是一个函数,不能被
<a href="functions.variable_functions.html" class="link">可变函数</a> 调用。
</span>
</p></blockquote>
<div class="tip"><strong class="tip">Tip</strong><p class="simpara">和直接将结果输出到浏览器一样,可使用<a href="book.outcontrol.html" class="link">输出控制函数</a>来捕获当前函数的输出,然后(例如)保存到一个 <span class="type"><a href="language.types.string.html" class="type string">string</a></span> 中。</p></div>
<blockquote class="note"><p><strong class="note">Note</strong>:
<p class="para">
如果在执行的代码中产生了一个致命的错误fatal error整个脚本会退出。
</p>
</p></blockquote>
</div>
<div class="refsect1 seealso" id="refsect1-function.eval-seealso">
<h3 class="title">参见</h3>
<p class="para">
<ul class="simplelist">
<li class="member"><span class="function"><a href="call_user_func.html" class="function" rel="rdfs-seeAlso">call_user_func()</a> - 把第一个参数作为回调函数调用</span></li>
</ul>
</p>
</div>
</div></div></div></body></html>