<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/migration70.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'zh',
  ),
  'this' => 
  array (
    0 => 'migration70.incompatible.php',
    1 => '不向后兼容的变更',
    2 => '不向后兼容的变更',
  ),
  'up' => 
  array (
    0 => 'migration70.php',
    1 => '从 PHP 5.6.x 移植到 PHP 7.0.x',
  ),
  'prev' => 
  array (
    0 => 'migration70.php',
    1 => '从 PHP 5.6.x 移植到 PHP 7.0.x',
  ),
  'next' => 
  array (
    0 => 'migration70.new-features.php',
    1 => '新特性',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'zh',
    'path' => 'appendices/migration70/incompatible.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="migration70.incompatible" class="sect1">
 <h2 class="title">不向后兼容的变更</h2>

 



<div class="sect2" id="migration70.incompatible.error-handling">
 <h3 class="title">错误和异常处理相关的变更</h3>

 <p class="para">
  在 PHP 7 中，很多致命错误以及可恢复的致命错误，都被转换为异常来处理了。这些异常继承自
  <span class="classname"><a href="class.error.php" class="classname">Error</a></span> 类，此类实现了 
  <span class="classname"><a href="class.throwable.php" class="classname">Throwable</a></span> 接口（所有异常都实现了这个基础接口）。
 </p>

 <p class="para">
  这也意味着，当发生错误的时候，以前代码中的一些错误处理的代码将无法被触发。因为在
  PHP 7 版本中，已经使用抛出异常的错误处理机制了。（如果代码中没有捕获
  <span class="classname"><a href="class.error.php" class="classname">Error</a></span> 异常，那么会引发致命错误）。
 </p>

 <p class="para">
  PHP 7 中的错误处理的更完整的描述，请参见 <a href="language.errors.php7.php" class="link">PHP 7
  错误处理</a>。本迁移指导主要是列出对兼容性有影响的变更。
 </p>

 <div class="sect3" id="migration70.incompatible.error-handling.set-exception-handler">
  <h4 class="title">
   <span class="function"><a href="function.set-exception-handler.php" class="function">set_exception_handler()</a></span> 不再保证收到的一定是 <span class="classname"><a href="class.exception.php" class="classname">Exception</a></span> 对象
  </h4>

  <p class="para">
   抛出 <span class="classname"><a href="class.error.php" class="classname">Error</a></span> 对象时，如果 <span class="function"><a href="function.set-exception-handler.php" class="function">set_exception_handler()</a></span> 里的异常处理代码声明了类型 <span class="classname"><a href="class.exception.php" class="classname">Exception</a></span> ，将会导致 fatal error。
  </p>

  <p class="para">
   想要异常处理器同时支持 PHP 5 和 7，应该删掉异常处理器里的类型声明。如果代码仅仅是升级到 PHP 7，则可以把类型 <span class="classname"><a href="class.exception.php" class="classname">Exception</a></span> 替换成 <span class="classname"><a href="class.throwable.php" class="classname">Throwable</a></span>。
  </p>

  <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">// PHP 5 时代的代码将会出现问题<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">handler</span><span style="color: #007700">(</span><span style="color: #0000BB">Exception $e</span><span style="color: #007700">) { </span><span style="color: #FF8000">/* ... */ </span><span style="color: #007700">}<br /></span><span style="color: #0000BB">set_exception_handler</span><span style="color: #007700">(</span><span style="color: #DD0000">'handler'</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// 兼容 PHP 5 和 7<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">handler</span><span style="color: #007700">(</span><span style="color: #0000BB">$e</span><span style="color: #007700">) { </span><span style="color: #FF8000">/* ... */ </span><span style="color: #007700">}<br /><br /></span><span style="color: #FF8000">// 仅支持 PHP 7<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">handler</span><span style="color: #007700">(</span><span style="color: #0000BB">Throwable $e</span><span style="color: #007700">) { </span><span style="color: #FF8000">/* ... */ </span><span style="color: #007700">}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </div>
 
 <div class="sect3" id="migration70.incompatible.error-handling.constructors">
  <h4 class="title">当内部构造方法失败的时候，始终抛出异常</h4>

  <p class="para">
   在之前版本中，如果内部类的构造方法出错，会返回 <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> 
   或者一个不可用的对象。从 PHP 7 开始，如果内部类构造方法发生错误，那么会抛出异常。
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.error-handling.parse">
  <h4 class="title">解析错误会抛出 <span class="classname"><a href="class.parseerror.php" class="classname">ParseError</a></span> 异常</h4>

  <p class="para">
   解析错误会抛出 <span class="classname"><a href="class.parseerror.php" class="classname">ParseError</a></span> 异常。对于 <span class="function"><a href="function.eval.php" class="function">eval()</a></span>
   函数，需要将其包含到一个
   <a href="language.exceptions.php#language.exceptions.catch" class="link"><code class="literal">catch</code></a> 代码块中来处理解析错误。
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.error-handling.strict">
  <h4 class="title">E_STRICT 警告级别变更</h4>

  <p class="para">
   原有的 <strong><code><a href="errorfunc.constants.php#constant.e-strict">E_STRICT</a></code></strong> 警告都被迁移到其他级别。<strong><code><a href="errorfunc.constants.php#constant.e-strict">E_STRICT</a></code></strong>
   常量会被保留，所以调用 
   <code class="literal">error_reporting(E_ALL|E_STRICT)</code> 不会引发错误。
  </p>
  <p class="para">
   <table class="doctable table">
    <caption><strong><strong><code><a href="errorfunc.constants.php#constant.e-strict">E_STRICT</a></code></strong> 警告级别变更</strong></caption>
     
      <thead>
       <tr>
        <th>场景</th>
        <th>新的级别/行为</th>
       </tr>

      </thead>

      <tbody class="tbody">
       <tr>
        <td>将资源类型的变量用作键来进行索引</td>
        <td><strong><code><a href="errorfunc.constants.php#constant.e-notice">E_NOTICE</a></code></strong></td>
       </tr>

       <tr>
        <td>抽象静态方法</td>
        <td>不再警告，会引发错误</td>
       </tr>

       <tr>
        <td>重复定义构造器函数</td>
        <td>不再警告，会引发错误</td>
       </tr>

       <tr>
        <td>在继承的时候，方法签名不匹配</td>
        <td><strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong></td>
       </tr>

       <tr>
        <td>在两个 trait 中包含相同的（兼容的）属性</td>
        <td>不再警告，会引发错误</td>
       </tr>

       <tr>
        <td>以非静态调用的方式访问静态属性</td>
        <td><strong><code><a href="errorfunc.constants.php#constant.e-notice">E_NOTICE</a></code></strong></td>
       </tr>

       <tr>
        <td>变量应该以引用的方式赋值</td>
        <td><strong><code><a href="errorfunc.constants.php#constant.e-notice">E_NOTICE</a></code></strong></td>
       </tr>

       <tr>
        <td>变量应该以引用的方式传递（到函数参数中）</td>
        <td><strong><code><a href="errorfunc.constants.php#constant.e-notice">E_NOTICE</a></code></strong></td>
       </tr>

       <tr>
        <td>以静态方式调用实例方法</td>
        <td><strong><code><a href="errorfunc.constants.php#constant.e-deprecated">E_DEPRECATED</a></code></strong></td>
       </tr>

      </tbody>
     
    </table>

   </p>
 </div>
</div>



 


<div class="sect2" id="migration70.incompatible.variable-handling">
 <h3 class="title">关于变量处理的变化</h3>

 <p class="para">
  PHP 7 现在使用了抽象语法树来解析源代码。这使得许多由于之前的 PHP
  的解释器的限制所不可能实现的改进得以实现。但出于一致性的原因导致了一些特殊例子的变动，而这些变动打破了向后兼容。在这一章中将详细介绍这些例子。
 </p>

 <div class="sect3" id="migration70.incompatible.variable-handling.indirect">
  <h4 class="title">
   关于间接使用变量、属性和方法的变化
  </h4>

  <p class="para">
   对变量、属性和方法的间接调用现在将严格遵循从左到右的顺序来解析，而不是之前的混杂着几个特殊案例的情况。下面这张表说明了这个解析顺序的变化。
  </p>

  <p class="para">
   <table class="doctable table">
    <caption><strong>间接调用的表达式的新旧解析顺序</strong></caption>
    
     <thead>
      <tr>
       <th>表达式</th>
       <th>PHP 5 的解析方式</th>
       <th>PHP 7 的解析方式</th>
      </tr>

     </thead>

     <tbody class="tbody">
      <tr>
       <td>
        <code class="code">$$foo[&#039;bar&#039;][&#039;baz&#039;]</code>
       </td>
       <td>
        <code class="code">${$foo[&#039;bar&#039;][&#039;baz&#039;]}</code>
       </td>
       <td>
        <code class="code">($$foo)[&#039;bar&#039;][&#039;baz&#039;]</code>
       </td>
      </tr>

      <tr>
       <td>
        <code class="code">$foo-&gt;$bar[&#039;baz&#039;]</code>
       </td>
       <td>
        <code class="code">$foo-&gt;{$bar[&#039;baz&#039;]}</code>
       </td>
       <td>
        <code class="code">($foo-&gt;$bar)[&#039;baz&#039;]</code>
       </td>
      </tr>

      <tr>
       <td>
        <code class="code">$foo-&gt;$bar[&#039;baz&#039;]()</code>
       </td>
       <td>
        <code class="code">$foo-&gt;{$bar[&#039;baz&#039;]}()</code>
       </td>
       <td>
        <code class="code">($foo-&gt;$bar)[&#039;baz&#039;]()</code>
       </td>
      </tr>

      <tr>
       <td>
        <code class="code">Foo::$bar[&#039;baz&#039;]()</code>
       </td>
       <td>
        <code class="code">Foo::{$bar[&#039;baz&#039;]}()</code>
       </td>
       <td>
        <code class="code">(Foo::$bar)[&#039;baz&#039;]()</code>
       </td>
      </tr>

     </tbody>
    
   </table>

  </p>

  <p class="para">
   使用了旧的从右到左的解析顺序的代码必须被重写，明确的使用大括号来表明顺序（参见上表中间一列）。这样使得代码既保持了与
   PHP 7.x 的前向兼容性，又保持了与 PHP 5.x 的后向兼容性。
  </p>
  
  <p class="para">
   这同样影响了 <a href="language.variables.scope.php#language.variables.scope.global" class="link"><code class="literal">global</code></a> 关键字。如果需要的话可以使用大括号来模拟之前的行为。
  </p>
  
  <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: #007700">function </span><span style="color: #0000BB">f</span><span style="color: #007700">() {<br />    </span><span style="color: #FF8000">// Valid in PHP 5 only.<br />    </span><span style="color: #007700">global $</span><span style="color: #0000BB">$foo</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bar</span><span style="color: #007700">;<br /><br />    </span><span style="color: #FF8000">// Valid in PHP 5 and 7.<br />    </span><span style="color: #007700">global ${</span><span style="color: #0000BB">$foo</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bar</span><span style="color: #007700">};<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.variable-handling.list">
  <h4 class="title">关于 <span class="function"><a href="function.list.php" class="function">list()</a></span> 处理方式的变更</h4>

  <div class="sect4" id="migration70.incompatible.variable-handling.list.order">
   <h5 class="title">
    <span class="function"><a href="function.list.php" class="function">list()</a></span> 不再以反向的顺序来进行赋值
   </h5>

   <p class="para">
    <span class="function"><a href="function.list.php" class="function">list()</a></span> 现在会按照变量定义的顺序来给他们进行赋值，而非反过来的顺序。
    通常来说，这只会影响 <span class="function"><a href="function.list.php" class="function">list()</a></span> 与数组的 <code class="code">[]</code> 操作符一起使用的案例，如下所示：
   </p>

   <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: #007700">list(</span><span style="color: #0000BB">$a</span><span style="color: #007700">[], </span><span style="color: #0000BB">$a</span><span style="color: #007700">[], </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: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #0000BB">3</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    <p class="para">以上示例在 PHP 5 中的输出：</p>
    <div class="example-contents screen">
<div class="cdata"><pre>
array(3) {
  [0]=&gt;
  int(3)
  [1]=&gt;
  int(2)
  [2]=&gt;
  int(1)
}
</pre></div>
    </div>
    <p class="para">以上示例在 PHP 7 中的输出：</p>
    <div class="example-contents screen">
<div class="cdata"><pre>
array(3) {
  [0]=&gt;
  int(1)
  [1]=&gt;
  int(2)
  [2]=&gt;
  int(3)
}
</pre></div>
    </div>
   </div>

   <p class="para">
    总之，我们推荐不要依赖 <span class="function"><a href="function.list.php" class="function">list()</a></span> 的赋值顺序，因为这是在未来也许会变更的实现细节。
   </p>
  </div>

  <div class="sect4" id="migration70.incompatible.variable-handling.list.empty">
   <h5 class="title">空的 <span class="function"><a href="function.list.php" class="function">list()</a></span> 赋值支持已经被移除</h5>

   <p class="para">
    <span class="function"><a href="function.list.php" class="function">list()</a></span> 结构现在不再能是空的。如下的例子不再被允许：
   </p>

   <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: #007700">list() = </span><span style="color: #0000BB">$a</span><span style="color: #007700">;<br />list(,,) = </span><span style="color: #0000BB">$a</span><span style="color: #007700">;<br />list(</span><span style="color: #0000BB">$x</span><span style="color: #007700">, list(), </span><span style="color: #0000BB">$y</span><span style="color: #007700">) = </span><span style="color: #0000BB">$a</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </div>

  <div class="sect4" id="migration70.incompatible.variable-handling.list.string">
   <h5 class="title"><span class="function"><a href="function.list.php" class="function">list()</a></span> 不再能解开 <span class="type"><a href="language.types.string.php" class="type string">string</a></span></h5>

   <p class="para">
    <span class="function"><a href="function.list.php" class="function">list()</a></span> 不再能解开字符串（<span class="type"><a href="language.types.string.php" class="type string">string</a></span>）变量。可以使用
    <span class="function"><a href="function.str-split.php" class="function">str_split()</a></span> 来代替。
   </p>
  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.variable-handling.array-order">
  <h4 class="title">
   当元素在引用赋值期间自动创建元素时，数组的顺序会发生改变。
  </h4>

  <p class="para">
   当通过引用赋值自动创建这些元素时，数组中元素的顺序就会发生变化。例如：
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$array </span><span style="color: #007700">= [];<br /></span><span style="color: #0000BB">$array</span><span style="color: #007700">[</span><span style="color: #DD0000">"a"</span><span style="color: #007700">] =&amp; </span><span style="color: #0000BB">$array</span><span style="color: #007700">[</span><span style="color: #DD0000">"b"</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">$array</span><span style="color: #007700">[</span><span style="color: #DD0000">"b"</span><span style="color: #007700">] = </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$array</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <p class="para">以上示例在 PHP 5 中的输出：</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
array(2) {
  [&quot;b&quot;]=&gt;
  &amp;int(1)
  [&quot;a&quot;]=&gt;
  &amp;int(1)
}
</pre></div>
   </div>
   <p class="para">以上示例在 PHP 7 中的输出：</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
array(2) {
  [&quot;a&quot;]=&gt;
  &amp;int(1)
  [&quot;b&quot;]=&gt;
  &amp;int(1)
}
</pre></div>
   </div>
  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.variable-handling.parentheses">
  <h4 class="title">
   函数参数附近的括号不再影响行为
  </h4>

  <p class="para">
   在 PHP 5中，在以引用方式传递函数参数时，使用冗余的括号对可以隐匿严格标准的警告。现在，这个警告总会触发。
  </p>

  <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: #007700">function </span><span style="color: #0000BB">getArray</span><span style="color: #007700">() {<br />    return [</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #0000BB">3</span><span style="color: #007700">];<br />}<br /><br />function </span><span style="color: #0000BB">squareArray</span><span style="color: #007700">(array &amp;</span><span style="color: #0000BB">$a</span><span style="color: #007700">) {<br />    foreach (</span><span style="color: #0000BB">$a </span><span style="color: #007700">as &amp;</span><span style="color: #0000BB">$v</span><span style="color: #007700">) {<br />        </span><span style="color: #0000BB">$v </span><span style="color: #007700">**= </span><span style="color: #0000BB">2</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #FF8000">// Generates a warning in PHP 7.<br /></span><span style="color: #0000BB">squareArray</span><span style="color: #007700">((</span><span style="color: #0000BB">getArray</span><span style="color: #007700">()));<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <p class="para">以上示例会输出：</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
Notice: Only variables should be passed by reference in /tmp/test.php on line 13
</pre></div>
   </div>
  </div>
 </div>
</div>



 


<div class="sect2" id="migration70.incompatible.foreach">
 <h3 class="title"> <a href="control-structures.foreach.php" class="link"><code class="literal">foreach</code></a> 的变化</h3>

 <p class="para">
  <a href="control-structures.foreach.php" class="link"><code class="literal">foreach</code></a> 发生了细微的变化，控制结构，主要围绕阵列的内部数组指针和迭代处理的修改。

 </p>

 <div class="sect3" id="migration70.incompatible.foreach.array-pointer">
  <h4 class="title"><a href="control-structures.foreach.php" class="link"><code class="literal">foreach</code></a> 不再改变内部数组指针</h4>

  <p class="para">
   在 PHP 7 之前，当数组通过 <a href="control-structures.foreach.php" class="link"><code class="literal">foreach</code></a> 迭代时，数组指针会移动。现在开始，不再如此，见下面代码
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$array </span><span style="color: #007700">= [</span><span style="color: #0000BB">0</span><span style="color: #007700">, </span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">];<br />foreach (</span><span style="color: #0000BB">$array </span><span style="color: #007700">as &amp;</span><span style="color: #0000BB">$val</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">current</span><span style="color: #007700">(</span><span style="color: #0000BB">$array</span><span style="color: #007700">));<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <p class="para">以上示例在 PHP 5 中的输出：</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
int(1)
int(2)
bool(false)
</pre></div>
   </div>
   <p class="para">以上示例在 PHP 7 中的输出：</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
int(0)
int(0)
int(0)
</pre></div>
   </div>
  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.foreach.by-value">
  <h4 class="title"><a href="control-structures.foreach.php" class="link"><code class="literal">foreach</code></a> 通过值遍历时，操作的值为数组的副本</h4>

  <p class="para">
   当默认使用通过值遍历数组时，<a href="control-structures.foreach.php" class="link"><code class="literal">foreach</code></a> 实际操作的是数组的迭代副本，而非数组本身。这就意味着迭代期间对数组所做的修改不会影响迭代的值。 
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.foreach.by-ref">
  <h4 class="title"><a href="control-structures.foreach.php" class="link"><code class="literal">foreach</code></a> 通过引用遍历时，有更好的迭代特性</h4>

  <p class="para">
   当使用引用遍历数组时，现在 <a href="control-structures.foreach.php" class="link"><code class="literal">foreach</code></a> 在迭代中能更好的跟踪变化。例如，在迭代中添加一个迭代值到数组中，参考下面的代码：
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$array </span><span style="color: #007700">= [</span><span style="color: #0000BB">0</span><span style="color: #007700">];<br />foreach (</span><span style="color: #0000BB">$array </span><span style="color: #007700">as &amp;</span><span style="color: #0000BB">$val</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$val</span><span style="color: #007700">);<br />    </span><span style="color: #0000BB">$array</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">] = </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <p class="para">以上示例在 PHP 5 中的输出：</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
int(0)
</pre></div>
   </div>
   <p class="para">以上示例在 PHP 7 中的输出：</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
int(0)
int(1)
</pre></div>
   </div>
  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.foreach.object">
  <h4 class="title">非 <span class="classname"><a href="class.traversable.php" class="classname">Traversable</a></span> 对象的遍历</h4>

  <p class="para">
   迭代一个非 <span class="classname"><a href="class.traversable.php" class="classname">Traversable</a></span> 对象将会与迭代一个引用数组的行为相同。这将导致在对象添加或删除属性时，<a href="migration70.incompatible.php#migration70.incompatible.foreach.by-ref" class="link"><a href="control-structures.foreach.php" class="link"><code class="literal">foreach</code></a> 通过引用遍历时，有更好的迭代特性</a>也能被应用
  </p>
 </div>
</div>



 


<div class="sect2" id="migration70.incompatible.integers">
 <h3 class="title"><span class="type"><a href="language.types.integer.php" class="type int">int</a></span> 处理更改</h3>

 <div class="sect3" id="migration70.incompatible.integers.invalid-octals">
  <h4 class="title">无效的八进制字符（Invalid octal literals）</h4>

  <p class="para">
   在之前，一个八进制字符如果含有无效数字，该无效数字将被静默删节（<code class="literal">0128</code>
   将被解析为 <code class="literal">012</code>）。现在这样的八进制字符将产生解析错误。
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.integers.negative-bitshift">
  <h4 class="title">负位移运算（Negative bitshifts）</h4>

  <p class="para">
   以负数形式进行的位移运算将会抛出一个
   <span class="classname"><a href="class.arithmeticerror.php" class="classname">ArithmeticError</a></span>：
  </p>
  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">1 </span><span style="color: #007700">&gt;&gt; -</span><span style="color: #0000BB">1</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

    <p class="para">以上示例在 PHP 5 中的输出：</p>
    <div class="example-contents screen">
<div class="cdata"><pre>
int(0)
</pre></div>
    </div>
    <p class="para">以上示例在 PHP 7 中的输出：</p>
    <div class="example-contents screen">
<div class="cdata"><pre>
Fatal error: Uncaught ArithmeticError: Bit shift by negative number in /tmp/test.php:2
Stack trace:
#0 {main}
  thrown in /tmp/test.php on line 2
</pre></div>
    </div>
  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.integers.out-of-range">
  <h4 class="title">超范围后产生位移</h4>

  <p class="para">
   超出 <span class="type"><a href="language.types.integer.php" class="type int">int</a></span> 位宽的位移操作（无论哪个方向）将始终得到 0 作为结果。在从前，这一操作是结构依赖的。
  </p>
 </div>


 <div class="sect3" id="migration70.incompatible.integers.div-by-zero">
  <h4 class="title">除以零的变化</h4>

  <p class="para">
   之前的版本中，当 0 被做为除数时，无论是除数（/）或取模（%）操作，都会抛出一个 E_WARNING 错误并返回
   <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>。现在，除法运算符（/）会返回一个由 IEEE 754 指定的浮点数：+INF, -INF 或
   NAN。取模操作符（%）则会抛出 <span class="classname"><a href="class.divisionbyzeroerror.php" class="classname">DivisionByZeroError</a></span> 异常，并且不再产生 E_WARNING 错误。
  </p>
  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">3</span><span style="color: #007700">/</span><span style="color: #0000BB">0</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">0</span><span style="color: #007700">/</span><span style="color: #0000BB">0</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">0</span><span style="color: #007700">%</span><span style="color: #0000BB">0</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <p class="para">以上示例在 PHP 5 中的输出：</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
Warning: Division by zero in %s on line %d
bool(false)

Warning: Division by zero in %s on line %d
bool(false)

Warning: Division by zero in %s on line %d
bool(false)
</pre></div>
   </div>
   <p class="para">以上示例在 PHP 7 中的输出：</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
Warning: Division by zero in %s on line %d
float(INF)

Warning: Division by zero in %s on line %d
float(NAN)

PHP Fatal error:  Uncaught DivisionByZeroError: Modulo by zero in %s line %d
</pre></div>
   </div>
  </div>
 </div>
</div>



 


<div class="sect2" id="migration70.incompatible.strings">
 <h3 class="title"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> 处理上的调整</h3>

 <div class="sect3" id="migration70.incompatible.strings.hex">
  <h4 class="title">十六进制字符串不再被认为是数字</h4>

  <p class="para">
   含十六进制字符串不再被认为是数字。例如：
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />var_dump</span><span style="color: #007700">(</span><span style="color: #DD0000">"0x123" </span><span style="color: #007700">== </span><span style="color: #DD0000">"291"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">is_numeric</span><span style="color: #007700">(</span><span style="color: #DD0000">"0x123"</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #DD0000">"0xe" </span><span style="color: #007700">+ </span><span style="color: #DD0000">"0x1"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">substr</span><span style="color: #007700">(</span><span style="color: #DD0000">"foo"</span><span style="color: #007700">, </span><span style="color: #DD0000">"0x1"</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <p class="para">以上示例在 PHP 5 中的输出：</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
bool(true)
bool(true)
int(15)
string(2) &quot;oo&quot;
</pre></div>
   </div>
   <p class="para">以上示例在 PHP 7 中的输出：</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
bool(false)
bool(false)
int(0)

Notice: A non well formed numeric value encountered in /tmp/test.php on line 5
string(3) &quot;foo&quot;
</pre></div>
   </div>
  </div>

  <p class="para">
   <span class="function"><a href="function.filter-var.php" class="function">filter_var()</a></span> 函数可以用于检查
   <span class="type"><a href="language.types.string.php" class="type string">string</a></span> 是否含有十六进制数字,并将其转换为 <span class="type"><a href="language.types.integer.php" class="type int">int</a></span>：
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$str </span><span style="color: #007700">= </span><span style="color: #DD0000">"0xffff"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$int </span><span style="color: #007700">= </span><span style="color: #0000BB">filter_var</span><span style="color: #007700">(</span><span style="color: #0000BB">$str</span><span style="color: #007700">, </span><span style="color: #0000BB">FILTER_VALIDATE_INT</span><span style="color: #007700">, </span><span style="color: #0000BB">FILTER_FLAG_ALLOW_HEX</span><span style="color: #007700">);<br />if (</span><span style="color: #0000BB">false </span><span style="color: #007700">=== </span><span style="color: #0000BB">$int</span><span style="color: #007700">) {<br />    throw new </span><span style="color: #0000BB">Exception</span><span style="color: #007700">(</span><span style="color: #DD0000">"Invalid integer!"</span><span style="color: #007700">);<br />}<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$int</span><span style="color: #007700">); </span><span style="color: #FF8000">// int(65535)<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.strings.unicode-escapes">
  <h4 class="title"><code class="literal">\u{</code> 可能引起错误</h4>

  <p class="para">
   由于新的
   <a href="migration70.new-features.php#migration70.new-features.unicode-codepoint-escape-syntax" class="link">Unicode codepoint
   转义语法</a>，紧连着无效序列并包含 <code class="literal">\u{</code> 的字串可能引起致命错误。为了避免这一报错，应该避免反斜线开头。
  </p>
 </div>
</div>



 



<div class="sect2" id="migration70.incompatible.removed-functions">
 <h3 class="title">移除的函数</h3>

 <div class="sect3" id="migration70.incompatible.removed-functions.call-user-method">
  <h4 class="title">
   <span class="function"><strong>call_user_method()</strong></span> 和
   <span class="function"><strong>call_user_method_array()</strong></span>
  </h4>

  <p class="para">
   这两个函数从 PHP 4.1.0 开始被废弃，应该使用
   <span class="function"><a href="function.call-user-func.php" class="function">call_user_func()</a></span> 和
   <span class="function"><a href="function.call-user-func-array.php" class="function">call_user_func_array()</a></span>。也可以考虑使用<a href="functions.variable-functions.php" class="link">变量函数</a>或者
   <a href="functions.arguments.php#functions.variable-arg-list" class="link"><code class="literal">...</code></a>
   操作符。
  </p>
 </div>
 
 <div class="sect3" id="migration70.incompatible.removed-functions.ereg">
  <h4 class="title">
   所有的 ereg* 函数
  </h4>
  <p class="para">
   所有 <code class="literal">ereg</code> 系列函数被删掉了。<a href="book.pcre.php" class="link">PCRE</a> 作为推荐的替代品。
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.removed-functions.mcrypt">
  <h4 class="title"><a href="book.mcrypt.php" class="link">mcrypt</a> 别名</h4>

  <p class="para">
   已废弃的 <span class="function"><strong>mcrypt_generic_end()</strong></span> 函数已被移除，请使用 <span class="function"><a href="function.mcrypt-generic-deinit.php" class="function">mcrypt_generic_deinit()</a></span> 代替。
  </p>

  <p class="para">
   此外，已废弃的 <span class="function"><strong>mcrypt_ecb()</strong></span>，<span class="function"><strong>mcrypt_cbc()</strong></span>、<span class="function"><strong>mcrypt_cfb()</strong></span> 和
   <span class="function"><strong>mcrypt_ofb()</strong></span> 函数已被移除，请配合恰当的 <strong><code>MCRYPT_MODE_<span class="replaceable">*</span></code></strong>
   常量来使用 <span class="function"><a href="function.mcrypt-decrypt.php" class="function">mcrypt_decrypt()</a></span> 进行代替。
  </p>
 </div>

 
 <div class="sect3" id="migration70.incompatible.removed-functions.mysql">
  <h4 class="title">
   所有 ext/mysql 函数
  </h4>
  <p class="para">
   所有 <a href="book.mysql.php" class="link">ext/mysql</a> 函数已被删掉了。如何选择不同的 MySQL API，详情请见<a href="mysqlinfo.api.choosing.php" class="link">选择 MySQL API</a>。
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.removed-functions.mssql">
  <h4 class="title">
   所有 ext/mssql 函数
  </h4>
  <p class="para">
   所有 <a href="" class="link">ext/mssql</a> 函数已被移除。
   <ul class="simplelist">
    <li><a href="ref.pdo-sqlsrv.php" class="link">PDO_SQLSRV</a></li>
    <li><a href="ref.pdo-odbc.php" class="link">PDO_ODBC</a></li>
    <li><a href="book.sqlsrv.php" class="link">SQLSRV</a></li>
    <li><a href="book.uodbc.php" class="link">Unified ODBC API</a></li>
   </ul>
  </p>
 </div>
 
 <div class="sect3" id="migration70.incompatible.removed-functions.intl">
  <h4 class="title"><a href="book.intl.php" class="link">intl</a> 别名</h4>

  <p class="para">
   已废弃的 <span class="function"><strong>datefmt_set_timezone_id()</strong></span> 和
   <span class="methodname"><strong>IntlDateFormatter::setTimeZoneID()</strong></span> 函数已被移除，请使用 <span class="function"><a href="intldateformatter.settimezone.php" class="function">datefmt_set_timezone()</a></span> 与
   <span class="methodname"><a href="intldateformatter.settimezone.php" class="methodname">IntlDateFormatter::setTimeZone()</a></span> 代替。
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.removed-functions.magic-quotes">
  <h4 class="title"><span class="function"><strong>set_magic_quotes_runtime()</strong></span></h4>

  <p class="para">
   移除了 <span class="function"><strong>set_magic_quotes_runtime()</strong></span> 和它的别名
   <span class="function"><strong>magic_quotes_runtime()</strong></span>。它们在 PHP 5.3.0 中已经被废弃，并由于 PHP 5.4.0 移除魔术引号（Magic Quotes）而没有用处。
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.removed-functions.set-socket-blocking">
  <h4 class="title"><span class="function"><strong>set_socket_blocking()</strong></span></h4>

  <p class="para">
   已废弃的 <span class="function"><strong>set_socket_blocking()</strong></span> 函数已被移除，请使用 <span class="function"><a href="function.stream-set-blocking.php" class="function">stream_set_blocking()</a></span> 代替。
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.removed-functions.dl">
  <h4 class="title">PHP-FPM 中的 <span class="function"><a href="function.dl.php" class="function">dl()</a></span></h4>

  <p class="para">
   <span class="function"><a href="function.dl.php" class="function">dl()</a></span> 在 PHP-FPM 不再可用，在 CLI 和 embed SAPI 中仍可用。
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.removed-functions.gd">
  <h4 class="title"><a href="book.image.php" class="link">GD</a> Type1 函数</h4>

  <p class="para">
   GD 扩展中移除了对 PostScript Type1 字体的支持，从而移除了以下函数：
  </p>

  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara">
     <span class="function"><strong>imagepsbbox()</strong></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><strong>imagepsencodefont()</strong></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><strong>imagepsextendfont()</strong></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><strong>imagepsfreefont()</strong></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><strong>imagepsloadfont()</strong></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><strong>imagepsslantfont()</strong></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><strong>imagepstext()</strong></span>
    </span>
   </li>
  </ul>

  <p class="para">
   推荐使用 TrueType 字体和相关的函数作为替代。
  </p>
 </div>
</div>



 


<div class="sect2" id="migration70.incompatible.removed-ini-directives">
 <h3 class="title">移除掉的 INI 配置指令</h3>

 <div class="sect3" id="migration70.incompatible.removed-ini-directives.features">
  <h4 class="title">被移除的功能</h4>

  <p class="para">
   以下 INI 配置指令已经被移除，同时移除的还有其对应的功能
  </p>

  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara">
     <code class="parameter">always_populate_raw_post_data</code>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <code class="parameter">asp_tags</code>
    </span>
   </li>
  </ul>
 </div>

 <div class="sect3" id="migration70.incompatible.removed-ini-directives.xsl">
  <h4 class="title"><code class="parameter">xsl.security_prefs</code></h4>

  <p class="para">
   已移除 <code class="parameter">xsl.security_prefs</code> 指令。取而代之的是，应该调用 XsltProcessor：：setSecurityPrefs() 方法来控制预处理器的基础安全首选项。
  </p>
 </div>
</div>



 



<div class="sect2" id="migration70.incompatible.other">
 <h3 class="title">其他向后兼容相关的变更</h3>

 <div class="sect3" id="migration70.incompatible.other.new-by-ref">
  <h4 class="title">new 操作符创建的对象不能以引用方式赋值给变量</h4>

  <p class="para">
   <a href="language.oop5.basic.php#language.oop5.basic.new" class="link"><code class="literal">new</code></a> 语句创建的对象不能以引用的方式赋值给变量。
  </p>

  <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: #007700">class </span><span style="color: #0000BB">C </span><span style="color: #007700">{}<br /></span><span style="color: #0000BB">$c </span><span style="color: #007700">=&amp; new </span><span style="color: #0000BB">C</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <p class="para">以上示例在 PHP 5 中的输出：</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
Deprecated: Assigning the return value of new by reference is deprecated in /tmp/test.php on line 3
</pre></div>
   </div>
   <p class="para">以上示例在 PHP 7 中的输出：</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
Parse error: syntax error, unexpected &#039;new&#039; (T_NEW) in /tmp/test.php on line 3
</pre></div>
   </div>
  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.other.classes">
  <h4 class="title">无效的类、接口以及 trait 命名</h4>

  <p class="para">
   不能以下列名字来命名类、接口以及 trait：
  </p>

  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara"><span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span></span>
   </li>
   <li class="listitem">
    <span class="simpara"><span class="type"><a href="language.types.integer.php" class="type int">int</a></span></span>
   </li>
   <li class="listitem">
    <span class="simpara"><span class="type"><a href="language.types.float.php" class="type float">float</a></span></span>
   </li>
   <li class="listitem">
    <span class="simpara"><span class="type"><a href="language.types.string.php" class="type string">string</a></span></span>
   </li>
   <li class="listitem">
    <span class="simpara"><strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong></span>
   </li>
   <li class="listitem">
    <span class="simpara"><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong></span>
   </li>
   <li class="listitem">
    <span class="simpara"><strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong></span>
   </li>
  </ul>

  <p class="para">
   此外，也不要使用下列的名字来命名类、接口以及 trait。虽然在 PHP
   7.0 中，这并不会引发错误，但是这些名字是保留给将来使用的。
  </p>

  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara"><span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span></span>
   </li>
   <li class="listitem">
    <span class="simpara"><span class="type"><a href="language.types.object.php" class="type object">object</a></span></span>
   </li>
   <li class="listitem">
    <span class="simpara"><span class="type"><a href="language.types.mixed.php" class="type mixed">mixed</a></span></span>
   </li>
   <li class="listitem">
    <span class="simpara"><span class="type">numeric</span></span>
   </li>
  </ul>
 </div>

 <div class="sect3" id="migration70.incompatible.other.php-tags">
  <h4 class="title">移除了 ASP 和 script PHP 标签</h4>

  <p class="para">
   使用类似 ASP 的标签，以及 script 标签来区分 PHP 代码的方式被移除。
   受到影响的标签有：
  </p>

  <table class="doctable table">
   <caption><strong>被移除的 ASP 和 script 标签</strong></caption>
   
    <thead>
     <tr>
      <th>开标签</th>
      <th>闭标签</th>
     </tr>

    </thead>

    <tbody class="tbody">
     <tr>
      <td><code class="code">&lt;%</code></td>
      <td><code class="code">%&gt;</code></td>
     </tr>

     <tr>
      <td><code class="code">&lt;%=</code></td>
      <td><code class="code">%&gt;</code></td>
     </tr>

     <tr>
      <td><code class="code">&lt;script language=&quot;php&quot;&gt;</code></td>
      <td><code class="code">&lt;/script&gt;</code></td>
     </tr>

    </tbody>
   
  </table>

 </div>

 <div class="sect3" id="migration70.incompatible.other.incompatible-this">
  <h4 class="title">从不匹配的上下文发起调用</h4>

  <p class="para">
   在不匹配的上下文中以静态方式调用非静态方法，<a href="migration56.deprecated.php#migration56.deprecated.incompatible-context" class="link">在
   PHP 5.6 中已经废弃</a>，但是在 PHP 7.0 中，会导致被调用方法中未定义 <code class="literal">$this</code> 变量，以及此行为已经废弃的警告。
  </p>

  <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: #007700">class </span><span style="color: #0000BB">A </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">test</span><span style="color: #007700">() { </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$this</span><span style="color: #007700">); }<br />}<br /><br /></span><span style="color: #FF8000">// 注意：并没有从类 A 继承<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">B </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">callNonStaticMethodOfA</span><span style="color: #007700">() { </span><span style="color: #0000BB">A</span><span style="color: #007700">::</span><span style="color: #0000BB">test</span><span style="color: #007700">(); }<br />}<br /><br />(new </span><span style="color: #0000BB">B</span><span style="color: #007700">)-&gt;</span><span style="color: #0000BB">callNonStaticMethodOfA</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <p class="para">以上示例在 PHP 5.6 中的输出：</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
Deprecated: Non-static method A::test() should not be called statically, assuming $this from incompatible context in /tmp/test.php on line 8
object(B)#1 (0) {
}
</pre></div>
   </div>
   <p class="para">以上示例在 PHP 7 中的输出：</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
Deprecated: Non-static method A::test() should not be called statically in /tmp/test.php on line 8

Notice: Undefined variable: this in /tmp/test.php on line 3
NULL
</pre></div>
   </div>
  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.other.yield">
  <h4 class="title"><a href="language.generators.syntax.php#control-structures.yield" class="link"><code class="literal">yield</code></a> 变更为右联接运算符</h4>

  <p class="para">
   在使用 <a href="language.generators.syntax.php#control-structures.yield" class="link"><code class="literal">yield</code></a> 关键字的时候，不再需要括号，并且它变更为右联接操作符，其运算符优先级介于
   <code class="literal">print</code> 和 <code class="literal">=&gt;</code> 之间。这可能导致现有代码的行为发生改变：
  </p>

  <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: #007700">echo yield -</span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /></span><span style="color: #FF8000">// 在之前版本中会被解释为：<br /></span><span style="color: #007700">echo (yield) - </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /></span><span style="color: #FF8000">// 现在，它将被解释为：<br /></span><span style="color: #007700">echo yield (-</span><span style="color: #0000BB">1</span><span style="color: #007700">);<br /><br />yield </span><span style="color: #0000BB">$foo </span><span style="color: #007700">or die;<br /></span><span style="color: #FF8000">// 在之前版本中会被解释为：<br /></span><span style="color: #007700">yield (</span><span style="color: #0000BB">$foo </span><span style="color: #007700">or die);<br /></span><span style="color: #FF8000">// 现在，它将被解释为：<br /></span><span style="color: #007700">(yield </span><span style="color: #0000BB">$foo</span><span style="color: #007700">) or die;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>

  <p class="para">
   可以通过使用括号来消除歧义。
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.other.func-parameters">
  <h4 class="title">函数定义不可以包含多个同名参数</h4>

  <p class="para">
   在函数定义中，不可以包含两个或多个同名的参数。例如，下面代码中的函数定义会触发
   <strong><code><a href="errorfunc.constants.php#constant.e-compile-error">E_COMPILE_ERROR</a></code></strong> 错误：
  </p>

  <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: #007700">function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">, </span><span style="color: #0000BB">$b</span><span style="color: #007700">, </span><span style="color: #0000BB">$unused</span><span style="color: #007700">, </span><span style="color: #0000BB">$unused</span><span style="color: #007700">) {<br />    </span><span style="color: #FF8000">//<br /></span><span style="color: #007700">}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.other.multiple-default">
  <h4 class="title">Switch 语句不可以包含多个 default 块</h4>

  <p class="para">
   在 switch 语句中，两个或者多个 default 块的代码已经不再被支持。例如，下面代码中的 switch 语句会触发
   <strong><code><a href="errorfunc.constants.php#constant.e-compile-error">E_COMPILE_ERROR</a></code></strong> 错误：
  </p>

  <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: #007700">switch (</span><span style="color: #0000BB">1</span><span style="color: #007700">) {<br />    default:<br />    break;<br />    default:<br />    break;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </div>
 
 <div class="sect3" id="migration70.incompatible.other.func-parameter-modified">
  <h4 class="title">在函数中检视参数值会返回<em>当前</em>的值</h4>

  <p class="para">
   当在函数代码中使用 <span class="function"><a href="function.func-get-arg.php" class="function">func_get_arg()</a></span> 或 
   <span class="function"><a href="function.func-get-args.php" class="function">func_get_args()</a></span> 函数来检视参数值，或者使用 <span class="function"><a href="function.debug-backtrace.php" class="function">debug_backtrace()</a></span>
   函数查看回溯跟踪，以及在异常回溯中所报告的参数值是指参数当前的值（有可能是已经被函数内的代码改变过的值），而不再是参数被传入函数时候的原始值了。
  </p>

  <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: #007700">function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">$x</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">$x</span><span style="color: #007700">++;<br />    </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">func_get_arg</span><span style="color: #007700">(</span><span style="color: #0000BB">0</span><span style="color: #007700">));<br />}<br /></span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">1</span><span style="color: #007700">);</span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <p class="para">以上示例在 PHP 5 中的输出：</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
1
</pre></div>
   </div>
   <p class="para">以上示例在 PHP 7 中的输出：</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
2
</pre></div>
   </div>
  </div>
 </div>
 
 <div class="sect3" id="migration70.incompatible.other.http-raw-post-data">
  <h4 class="title"><var class="varname">$HTTP_RAW_POST_DATA</var> 被移除</h4>

  <p class="para">
   不再提供 <var class="varname">$HTTP_RAW_POST_DATA</var> 变量。请使用
   <a href="wrappers.php.php#wrappers.php.input" class="link"><code class="literal">php://input</code></a>
   作为替代。
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.other.ini-comments">
  <h4 class="title">INI 文件中 <code class="literal">#</code> 注释格式被移除</h4>

  <p class="para">
   在 INI 文件中，不再支持以 <code class="literal">#</code> 开始的注释行，请使用 <code class="literal">;</code>（分号）来表示注释。此变更适用于
   <var class="filename">php.ini</var> 以及用 <span class="function"><a href="function.parse-ini-file.php" class="function">parse_ini_file()</a></span> 和 <span class="function"><a href="function.parse-ini-string.php" class="function">parse_ini_string()</a></span> 函数来处理的文件。
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.other.json-to-jsond">
  <h4 class="title">JSON 扩展已经被 JSOND 取代</h4>

  <p class="para">
   JSON 扩展已经被 JSOND 扩展取代。对于数值的处理，有以下两点需要注意的：第一，数值不能以点号（.）结束（例如，数值
   <code class="literal">34.</code> 必须写作 
   <code class="literal">34.0</code> 或 <code class="literal">34</code>）。第二，如果使用科学计数法表示数值，<code class="literal">e</code>
   前面必须不是点号（.）（例如，<code class="literal">3.e3</code> 必须写作
   <code class="literal">3.0e3</code> 或 <code class="literal">3e3</code>）。另外，空字符串不再被视作有效的 JSON 字符串。
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.other.internal-function-failure-overflow">
  <h4 class="title">在数值溢出的时候，内部函数将会失败</h4>

  <p class="para">
   将浮点数转换为整数的时候，如果浮点数值太大，导致无法以整数表达的情况下，在之前的版本中，内部函数会直接将整数截断，并不会引发错误。在
   PHP 7.0 中，如果发生这种情况，会引发 E_WARNING 错误，并且返回 <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>。
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.other.fixes-custom-session-handler">
  <h4 class="title">自定义会话处理器的返回值修复</h4>

  <p class="para">
   在自定义会话处理器中，如果函数的返回值不是 <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>，也不是 <code class="literal">-1</code>，会引发致命错误。现在，如果这些函数的返回值不是布尔值，也不是
   <code class="literal">-1</code> 或者 <code class="literal">0</code>，函数调用结果将被视为失败，并且引发 E_WARNING 错误。
  </p>
 </div>
 
 <div class="sect3" id="migration70.incompatible.other.sort-order">
  <h4 class="title">相等的元素在排序时的顺序问题</h4>
  <p class="para">
   由于内部排序算法进行了提升，可能会导致对比时被视为相等的多个元素之间的顺序不稳定。
  </p>
  <blockquote class="note"><p><strong class="note">注意</strong>: 
   <p class="para">
    在对比时被视为相等的多个元素之间的排序顺序是不可信赖的，即使是相等的两个元素，他们的位置也可能被排序算法所改变。
   </p>
  </p></blockquote>
 </div>
 
 <div class="sect3" id="migration70.incompatible.other.break-continue">
  <h4 class="title">错误的使用 break 和 continue 语句</h4>
  <p class="para">
   在循环或者 <code class="literal">switch</code> 语句之外使用
   <code class="literal">break</code> 和 <code class="literal">continue</code> 
   被视为编译型错误（之前视为运行时错误），会引发
   <strong><code><a href="errorfunc.constants.php#constant.e-compile-error">E_COMPILE_ERROR</a></code></strong> 错误。
  </p>
 </div>
 
 <div class="sect3" id="migration70.incompatible.other.break-continue-constant">
  <h4 class="title">常量禁止作为 break 和 continue 的参数</h4>
  <p class="para">
   <code class="literal">break</code> 和 <code class="literal">continue</code> 语句不再允许他们的参数为常量，并会触发
   <strong><code><a href="errorfunc.constants.php#constant.e-compile-error">E_COMPILE_ERROR</a></code></strong>。
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.other.mhash">
  <h4 class="title">Mhash 不再是一个单独的扩展了</h4>
  <p class="para">
   Mhash 扩展已经被完全整合进 <a href="book.hash.php" class="link">Hash</a> 扩展了。因此，不要再使用 <span class="function"><a href="function.extension-loaded.php" class="function">extension_loaded()</a></span>
   函数来检测是否支持 MHash 扩展了，建议使用
   <span class="function"><a href="function.function-exists.php" class="function">function_exists()</a></span> 函数来进行检测。另外，函数
   <span class="function"><a href="function.get-loaded-extensions.php" class="function">get_loaded_extensions()</a></span> 以及相关的特性中，也不再报告和 MHash 扩展相关的信息了。
  </p>
 </div>
 
 <div class="sect3" id="migration70.incompatible.other.declare-ticks">
  <h4 class="title">declare(ticks)</h4>
  <p class="para">
   <a href="control-structures.declare.php#control-structures.declare.ticks" class="link">declare(ticks)</a>
   指示符不再泄漏到不同的编译单元中。
  </p>
 </div>
</div>



</div><?php manual_footer($setup); ?>