<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.control-structures.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'zh',
  ),
  'this' => 
  array (
    0 => 'control-structures.declare.php',
    1 => 'declare',
    2 => 'declare',
  ),
  'up' => 
  array (
    0 => 'language.control-structures.php',
    1 => '流程控制',
  ),
  'prev' => 
  array (
    0 => 'control-structures.match.php',
    1 => 'match',
  ),
  'next' => 
  array (
    0 => 'function.return.php',
    1 => 'return',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'zh',
    'path' => 'language/control-structures/declare.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="control-structures.declare" class="sect1">
 <h2 class="title">declare</h2>
 <p class="verinfo">(PHP 4, PHP 5, PHP 7, PHP 8)</p>
 <p class="para">
  <code class="literal">declare</code> 结构用来设定一段代码的执行指令。<code class="literal">declare</code>
  的语法和其它流程控制结构相似：
  <div class="informalexample">
   <div class="example-contents">
<div class="cdata"><pre>
declare (directive)
    statement
</pre></div>
   </div>

  </div>
 </p>
 <p class="para">
  <code class="literal">directive</code> 部分允许设定 <code class="literal">declare</code>
  代码段的行为。
  目前只认识三个指令：
  <ul class="simplelist">
   <li><a href="control-structures.declare.php#control-structures.declare.ticks" class="link"><code class="literal">ticks</code></a></li>
   <li><a href="control-structures.declare.php#control-structures.declare.encoding" class="link"><code class="literal">encoding</code></a></li>
   <li><a href="language.types.declarations.php#language.types.declarations.strict" class="link"><code class="literal">strict_types</code></a></li>
  </ul>
 </p>
 <p class="para">
  因为本指令是在文件编译时处理的，所以指令只接受字面量的值。
  无法使用变量和常量。下面为你演示：
  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// 这样是有效的：<br /></span><span style="color: #007700">declare(</span><span style="color: #0000BB">ticks</span><span style="color: #007700">=</span><span style="color: #0000BB">1</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// 这样是无效的：<br /></span><span style="color: #007700">const </span><span style="color: #0000BB">TICK_VALUE </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />declare(</span><span style="color: #0000BB">ticks</span><span style="color: #007700">=</span><span style="color: #0000BB">TICK_VALUE</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>
 <p class="para">
  <code class="literal">declare</code> 代码段中的 <code class="literal">statement</code>
  部分将被执行——怎样执行以及执行中有什么副作用出现取决于
  <code class="literal">directive</code> 中设定的指令。
 </p>
 <p class="para">
  <code class="literal">declare</code> 结构也可用于全局范围，影响到其后的所有代码（但如果有
  <code class="literal">declare</code> 结构的文件被其它文件包含，则对包含它的父文件不起作用）。
  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// 两者相等：<br /><br />// 可以这样用：<br /></span><span style="color: #007700">declare(</span><span style="color: #0000BB">ticks</span><span style="color: #007700">=</span><span style="color: #0000BB">1</span><span style="color: #007700">) {<br />    </span><span style="color: #FF8000">// 这里写完整的脚本<br /></span><span style="color: #007700">}<br /><br /></span><span style="color: #FF8000">// 也可以这样用：<br /></span><span style="color: #007700">declare(</span><span style="color: #0000BB">ticks</span><span style="color: #007700">=</span><span style="color: #0000BB">1</span><span style="color: #007700">);<br /></span><span style="color: #FF8000">// 这里写完整的脚本<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>
 
 <div class="sect2" id="control-structures.declare.ticks">
  <h3 class="title">Ticks</h3>
  <p class="para">
   Tick（时钟周期）是一个在 <code class="literal">declare</code> 代码段中解释器每执行
   <var class="varname">N</var> 条可计时的低级语句就会发生的事件。<var class="varname">N</var>
   的值是在 <code class="literal">declare</code> 中的 <code class="literal">directive</code> 部分用
   <code class="code">ticks=<var class="varname">N</var></code> 来指定的。
  </p>
  <p class="para">
   不是所有语句都可计时。通常条件表达式和参数表达式都不可计时。
  </p>
  <p class="para">
   在每个 tick 中出现的事件是由 <span class="function"><a href="function.register-tick-function.php" class="function">register_tick_function()</a></span>
   来指定的。更多细节见下面的例子。注意每个 tick 中可以出现多个事件。
  </p>
  <p class="para">
   <div class="example" id="example-1">
    <p><strong>示例 #1 Tick 的用法示例</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">declare(</span><span style="color: #0000BB">ticks</span><span style="color: #007700">=</span><span style="color: #0000BB">1</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// 每次 tick 事件都会调用该函数<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">tick_handler</span><span style="color: #007700">()<br />{<br />    echo </span><span style="color: #DD0000">"tick_handler() called\n"</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">register_tick_function</span><span style="color: #007700">(</span><span style="color: #DD0000">'tick_handler'</span><span style="color: #007700">); </span><span style="color: #FF8000">// 引起 tick 事件<br /><br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">; </span><span style="color: #FF8000">// 引起 tick 事件<br /><br /></span><span style="color: #007700">if (</span><span style="color: #0000BB">$a </span><span style="color: #007700">&gt; </span><span style="color: #0000BB">0</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">$a </span><span style="color: #007700">+= </span><span style="color: #0000BB">2</span><span style="color: #007700">; </span><span style="color: #FF8000">// 引起 tick 事件<br />    </span><span style="color: #007700">print </span><span style="color: #0000BB">$a</span><span style="color: #007700">; </span><span style="color: #FF8000">// 引起 tick 事件<br /></span><span style="color: #007700">}<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
  </p>
  <p class="simpara">
   参见 <span class="function"><a href="function.register-tick-function.php" class="function">register_tick_function()</a></span> 和
   <span class="function"><a href="function.unregister-tick-function.php" class="function">unregister_tick_function()</a></span>。
  </p>
 </div>
 
 <div class="sect2" id="control-structures.declare.encoding">
  <h3 class="title">Encoding</h3>
  <p class="para">
   可以用 <code class="literal">encoding</code> 指令来对每段脚本指定其编码方式。
   <div class="example" id="example-2">
    <p><strong>示例 #2 对脚本指定编码方式</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">declare(</span><span style="color: #0000BB">encoding</span><span style="color: #007700">=</span><span style="color: #DD0000">'ISO-8859-1'</span><span style="color: #007700">);<br /></span><span style="color: #FF8000">// 在这里写代码<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   </div>
  </p>
  
  <div class="caution"><strong class="caution">警告</strong>
   <p class="simpara">
    当和命名空间结合起来时 declare 的唯一合法语法是
    <code class="literal">declare(encoding=&#039;...&#039;);</code>，其中 <code class="literal">...</code>
    是编码的值。而 <code class="literal">declare(encoding=&#039;...&#039;) {}</code>
    将在与命名空间结合时产生解析错误。
   </p>
  </div>
  <p class="para">
   参见 <a href="ini.core.php#ini.zend.script-encoding" class="link">zend.script_encoding</a>。
  </p>
 </div>
</div><?php manual_footer($setup); ?>