<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.operators.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'zh',
  ),
  'this' => 
  array (
    0 => 'language.operators.errorcontrol.php',
    1 => '错误控制',
    2 => '错误控制运算符',
  ),
  'up' => 
  array (
    0 => 'language.operators.php',
    1 => '运算符',
  ),
  'prev' => 
  array (
    0 => 'language.operators.comparison.php',
    1 => '比较',
  ),
  'next' => 
  array (
    0 => 'language.operators.execution.php',
    1 => '执行',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'zh',
    'path' => 'language/operators/errorcontrol.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.operators.errorcontrol" class="sect1">
 <h2 class="title">错误控制运算符</h2>
 
 <p class="simpara">
  PHP 支持一个错误控制运算符：<code class="literal">@</code>。当将其放置在一个 PHP
  表达式之前，该表达式可能产生的任何错误诊断都被抑制。
 </p>
 <p class="para">
  如果用 <span class="function"><a href="function.set-error-handler.php" class="function">set_error_handler()</a></span>
  设定了自定义的错误处理函数，即使诊断信息被抑制，也仍然会被调用。
 </p>

 <div class="warning"><strong class="warning">警告</strong>
  <p class="para">
   PHP 8.0.0 之前，如果错误被 <code class="literal">@</code> 运算符抑制，则在自定义错误处理程序中调用 <span class="function"><a href="function.error-reporting.php" class="function">error_reporting()</a></span> 将始终返回
   <code class="literal">0</code>。PHP 8.0.0 起，返回（按位）表达式的值：<code class="literal">E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR | E_RECOVERABLE_ERROR | E_PARSE</code>。
  </p>
 </div>

 <p class="simpara">
  <span class="function"><a href="function.error-get-last.php" class="function">error_get_last()</a></span> 返回数组中的 <code class="literal">&quot;message&quot;</code> 元素储存了表达式产生的任意错误信息。
  此函数的返回结果会随着每次错误的发生而相应变化，所以需要尽早检查。
 </p>
 <p class="para">
  <div class="example" id="example-1">
   <p><strong>示例 #1 故意文件错误</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$my_file </span><span style="color: #007700">= @</span><span style="color: #0000BB">file </span><span style="color: #007700">(</span><span style="color: #DD0000">'non_existent_file'</span><span style="color: #007700">) or<br />    die (</span><span style="color: #DD0000">"Failed opening file: error was '" </span><span style="color: #007700">. </span><span style="color: #0000BB">error_get_last</span><span style="color: #007700">()[</span><span style="color: #DD0000">'message'</span><span style="color: #007700">] . </span><span style="color: #DD0000">"'"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>
 <p class="para">
  <div class="example" id="example-2">
   <p><strong>示例 #2 表达式抑制</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// 这适用于所有表达式，而不仅仅是函数：<br /></span><span style="color: #0000BB">$value </span><span style="color: #007700">= @</span><span style="color: #0000BB">$cache</span><span style="color: #007700">[</span><span style="color: #0000BB">$key</span><span style="color: #007700">];<br /></span><span style="color: #FF8000">// 如果索引 $key 不存在，则不会发出通知。<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>
 <blockquote class="note"><p><strong class="note">注意</strong>: 
  <span class="simpara">
   <code class="literal">@</code> 运算符只对 <a href="language.expressions.php" class="link">表达式</a> 有效。
   对新手来说一个简单的规则就是：如果能从某处获得值，就能在它前面加上
   <code class="literal">@</code> 运算符。例如，可以把它放在变量，函数调用，某些语言构造调用（例如 <span class="function"><a href="function.include.php" class="function">include</a></span> ）等等之前。
   不能把它放在函数或类的定义之前，也不能用于条件结构例如 <code class="literal">if</code> 和 <a href="control-structures.foreach.php" class="link"><code class="literal">foreach</code></a> 等。
  </span>
 </p></blockquote>
 <div class="warning"><strong class="warning">警告</strong>
  <p class="para">
   PHP 8.0.0 之前，<code class="literal">@</code> 运算符会禁用导致脚本停止运行的严重错误。
   例如在调用一个不存在的函数前添加 <code class="literal">@</code>，由于函数不可用或者输入错误，
   将会导致脚本终止，而不会说明原因。
  </p>
 </div>

 <div class="sect2">
  <h3 class="title">参见</h3>
  <p class="para">
   <ul class="simplelist">
    <li><span class="function"><a href="function.error-reporting.php" class="function">error_reporting()</a></span></li>
    <li><a href="ref.errorfunc.php" class="link">错误处理与日志记录函数</a></li>
   </ul>
  </p>
 </div>
</div><?php manual_footer($setup); ?>