<?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 => 'ja',
  ),
  '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' => 'ja',
    '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">
  fatal error や recoverable fatal error の多くが、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">
  エラーではなく例外がスローされるようになるということは、自作のエラーハンドラは呼び出されなくなるということです
  (<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="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>
   型を宣言している場合は、
   <span class="classname"><a href="class.error.php" class="classname">Error</a></span> オブジェクトがスローされると 致命的なエラーが発生します。
  </p>

  <p class="para">
   PHP 5 と PHP 7 の両方で動くハンドラを書く場合は、ハンドラで型宣言をしてはいけません。
   PHP 5 で動いていたコードを移行する際に、そのコードが 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 でのこの実装は、そのままでは 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">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 では、同様の場合に
   <span class="classname"><a href="class.exception.php" class="classname">Exception</a></span> をスローするようになりました。
   ユーザー定義のクラスでは以前からそうすべきだとされていたことです。
  </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>Indexing by a resource</td>
        <td><strong><code><a href="errorfunc.constants.php#constant.e-notice">E_NOTICE</a></code></strong></td>
       </tr>

       <tr>
        <td>Abstract static methods</td>
        <td>通知は削除され、エラーにはならない</td>
       </tr>

       <tr>
        <td>&quot;Redefining&quot; a constructor</td>
        <td>通知は削除され、エラーにはならない</td>
       </tr>

       <tr>
        <td>Signature mismatch during inheritance</td>
        <td><strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong></td>
       </tr>

       <tr>
        <td>Same (compatible) property in two used traits</td>
        <td>通知は削除され、エラーにはならない</td>
       </tr>

       <tr>
        <td>Accessing static property non-statically</td>
        <td><strong><code><a href="errorfunc.constants.php#constant.e-notice">E_NOTICE</a></code></strong></td>
       </tr>

       <tr>
        <td>Only variables should be assigned by reference</td>
        <td><strong><code><a href="errorfunc.constants.php#constant.e-notice">E_NOTICE</a></code></strong></td>
       </tr>

       <tr>
        <td>Only variables should be passed by reference</td>
        <td><strong><code><a href="errorfunc.constants.php#constant.e-notice">E_NOTICE</a></code></strong></td>
       </tr>

       <tr>
        <td>Calling non-static methods statically</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">// PHP 5 でしか使えません<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">// PHP 5 と PHP 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> を作ることはできなくなりました。
    次のようなコードは PHP 7 では使えません。
   </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> は文字列を展開しない</h5>

   <p class="para">
    <span class="function"><a href="function.list.php" class="function">list()</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 では、関数の引数を冗長な括弧で囲んでおくと、
   関数の引数を参照渡しにした場合の警告を抑止することができました。
   PHP 7 では、たとえ括弧で囲んでも警告が常に発生します。
  </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">// 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>
   で配列を反復処理する際に、内部の配列ポインタを変更していました。
   PHP 7 ではそのようにはならず、以下の例のようになります。
  </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>
   も適用され、処理中のオブジェクトにプロパティを追加したり削除したりした場合に、
   それが反復処理に反映されます。
  </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">無効な形式の八進リテラル</h4>

  <p class="para">
   以前のバージョンでは、無効な数値が八進リテラルに含まれている場合は、
   単純にそれを無視していました (たとえば <code class="literal">0128</code> は
   <code class="literal">012</code> として扱っていました)。
   PHP 7 では、このような場合にパースエラーが発生します。
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.integers.negative-bitshift">
  <h4 class="title">負のビットシフト</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> となっていました。
   PHP 7 では、除算演算子の返す結果は float で、
   +INF、-INF あるいは NAN のいずれかとなります。
   これは、IEEE 754 で指定された挙動です。
   剰余演算子については E_WARNING が発生しなくなり、
   <span class="classname"><a href="class.divisionbyzeroerror.php" class="classname">DivisionByZeroError</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">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">文字列の取り扱いの変更</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.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 コードポイントのエスケープ構文</a>
   が導入されたことにより、<code class="literal">\u{</code> のあとに無効なシーケンスが続く文字列が
   fatal error となる可能性があります。
   これを回避するには、先頭のバックスラッシュをエスケープする必要があります。
  </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> も削除されました。
   <span class="function"><a href="function.mcrypt-decrypt.php" class="function">mcrypt_decrypt()</a></span> に、適切な
   <strong><code>MCRYPT_MODE_<span class="replaceable">*</span></code></strong> 定数を組み合わせて使いましょう。
  </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">
   <code class="literal">ext/mssql</code> のすべての関数が削除されました。
   代替となる選択肢については、以下を参照ください。
   <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 でマジッククォートが廃止された時点で事実上無意味になっていました。
  </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> が削除されました。
   かわりに <span class="methodname"><a href="xsltprocessor.setsecurityprefs.php" class="methodname">XsltProcessor::setSecurityPrefs()</a></span>
   メソッドを用いて、プロセッサ単位のセキュリティ設定を制御しましょう。
  </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">新しいオブジェクトを参照渡しで代入できない</h4>

  <p class="para">
   <a href="language.oop5.basic.php#language.oop5.basic.new" class="link"><code class="literal">new</code></a> 文の結果を参照渡しで変数に代入することができなくなりました。
   by reference:
  </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">無効なクラス名、インターフェイス名、トレイト名</h4>

  <p class="para">
   以下の名前は、クラスやインターフェイスそしてトレイトの名前としては使えなくなりました。
  </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">
   さらに、以下に挙げる名前も使うべきではありません。
   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 タグの廃止</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>、
   static ではないメソッドに対して非互換のコンテキストで static 呼び出しを行うと、
   呼ばれた側のメソッドが未定義の <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">// PHP 7 ではこのように解釈されます<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">// PHP 7 ではこのように解釈されます<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.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.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.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">
   これまでのバージョンでは、浮動小数点数値が大きすぎて整数として表せない場合に、
   float から integer に変換した結果を黙って切り詰めていました。
   PHP 7 では 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> を返すとき、fatal error が発生します。
   この関数が boolean 値か <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> を使用してください。
   さらに、Mhash は <span class="function"><a href="function.get-loaded-extensions.php" class="function">get_loaded_extensions()</a></span> および関連機能により報告されなくなりました。
  </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); ?>