<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/migration71.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ja',
  ),
  'this' => 
  array (
    0 => 'migration71.incompatible.php',
    1 => '下位互換性のない変更点',
    2 => '下位互換性のない変更点',
  ),
  'up' => 
  array (
    0 => 'migration71.php',
    1 => 'PHP 7.0.x から PHP 7.1.x への移行',
  ),
  'prev' => 
  array (
    0 => 'migration71.constants.php',
    1 => '新しいグローバル定数',
  ),
  'next' => 
  array (
    0 => 'migration71.deprecated.php',
    1 => 'PHP 7.1.x で推奨されなくなる機能',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ja',
    'path' => 'appendices/migration71/incompatible.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="migration71.incompatible" class="sect1">
 <h2 class="title">下位互換性のない変更点</h2>

 <div class="sect2" id="migration71.incompatible.too-few-arguments-exception">
  <h3 class="title">関数に渡す引数が少ない場合の挙動</h3>

  <p class="para">
   これまでのバージョンでは、ユーザー定義の関数に渡す引数が足りない場合は
   warning が発生していました。PHP 7.1 以降では、warning ではなく
   Error 例外が発生するようになります。
   この変更はユーザー定義の関数に対してだけのもので、
   内部関数には影響を及ぼしません。
  </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">test</span><span style="color: #007700">(</span><span style="color: #0000BB">$param</span><span style="color: #007700">){}<br /></span><span style="color: #0000BB">test</span><span style="color: #007700">();</span></span></code></div>
   </div>

   <p class="para">上の例の出力は、
たとえば以下のようになります。</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
Fatal error: Uncaught ArgumentCountError: Too few arguments to function test(), 0 passed in %s on line %d and exactly 1 expected in %s:%d
</pre></div>
   </div>
  </div>
 </div>

 <div class="sect2" id="migration71.incompatible.forbid-dynamic-calls-to-scope-introspection-functions">
  <h3 class="title">スコープを調べる関数の動的呼び出しの禁止</h3>

  <p class="para">
   ある種の関数について、動的な呼び出し
   (<code class="literal">$func()</code> や <code class="literal">array_map(&#039;extract&#039;, ...)</code> のような形式)
   が使えなくなりました。対象になるのは、別のスコープを調べたり変更したり、
   あいまいな挙動になってしまったりするような関数です。
   この変更の影響を受ける関数は、以下のとおりです。
  </p>

  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara">
     <span class="function"><a href="function.assert.php" class="function">assert()</a></span> - 最初の引数に文字列を渡した場合
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><a href="function.compact.php" class="function">compact()</a></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><a href="function.extract.php" class="function">extract()</a></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><a href="function.func-get-args.php" class="function">func_get_args()</a></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><a href="function.func-get-arg.php" class="function">func_get_arg()</a></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><a href="function.func-num-args.php" class="function">func_num_args()</a></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><a href="function.get-defined-vars.php" class="function">get_defined_vars()</a></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><a href="function.mb-parse-str.php" class="function">mb_parse_str()</a></span> - 引数が一つだけの場合
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><a href="function.parse-str.php" class="function">parse_str()</a></span> - 引数が一つだけの場合
    </span>
   </li>
  </ul>

  <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 () {<br />    </span><span style="color: #0000BB">$func </span><span style="color: #007700">= </span><span style="color: #DD0000">'func_num_args'</span><span style="color: #007700">;<br />    </span><span style="color: #0000BB">$func</span><span style="color: #007700">();<br />})();</span></span></code></div>
   </div>

   <p class="para">上の例の出力は以下となります。</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
Warning: Cannot call func_num_args() dynamically in %s on line %d
</pre></div>
   </div>
  </div>
 </div>

 <div class="sect2" id="migration71.incompatible.invalid-class-names">
  <h3 class="title">クラス、インターフェイス、トレイトに使えない名前</h3>

  <p class="para">
   これらのキーワードが、クラスやインターフェイスやトレイトの名前として使えなくなりました。
  </p>

  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara"><span class="type"><span class="type"><a href="language.types.void.php" class="type void">void</a></span></span></span>
   </li>
   <li class="listitem">
    <span class="simpara"><span class="type"><a href="language.types.iterable.php" class="type iterable">iterable</a></span></span>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration71.incompatible.numerical-strings-scientific-notation">
  <h3 class="title">数値形式文字列の変換が科学記法に対応</h3>

  <p class="para">
   数値形式の文字列の演算や型変換が、科学記法に対応するようになりました。
   <code class="literal">(int)</code> によるキャストや、
   <span class="function"><a href="function.intval.php" class="function">intval()</a></span> (基数が10の場合)、
   <span class="function"><a href="function.settype.php" class="function">settype()</a></span>、<span class="function"><a href="function.decbin.php" class="function">decbin()</a></span>、
   <span class="function"><a href="function.decoct.php" class="function">decoct()</a></span>、<span class="function"><a href="function.dechex.php" class="function">dechex()</a></span> といった関数もその対象です。
  </p>
 </div>

 <div class="sect2" id="migration71.incompatible.fixes-to-mt_rand-algorithm">
  <h3 class="title"><span class="function"><a href="function.mt-rand.php" class="function">mt_rand()</a></span> のアルゴリズムの修正</h3>

  <p class="para">
   <span class="function"><a href="function.mt-rand.php" class="function">mt_rand()</a></span> のデフォルトが、修正版のメルセンヌ・ツイスタ
   アルゴリズムを使うようになりました。<span class="function"><a href="function.mt-rand.php" class="function">mt_rand()</a></span>
   の結果に依存するコードを書いていた場合は、<span class="function"><a href="function.mt-srand.php" class="function">mt_srand()</a></span>
   のオプションの第二引数に <strong><code><a href="random.constants.php#constant.mt-rand-php">MT_RAND_PHP</a></code></strong>
   を指定すると、これまでの挙動 (間違った実装) を維持できます。
  </p>
 </div>

 <div class="sect2" id="migration71.incompatible.rand-srand-aliases">
  <h3 class="title">
   <span class="function"><a href="function.rand.php" class="function">rand()</a></span> と <span class="function"><a href="function.srand.php" class="function">srand()</a></span> が、
   それぞれ <span class="function"><a href="function.mt-rand.php" class="function">mt_rand()</a></span> と <span class="function"><a href="function.mt-srand.php" class="function">mt_srand()</a></span> のエイリアスとなる
  </h3>

  <p class="para">
   <span class="function"><a href="function.rand.php" class="function">rand()</a></span> と <span class="function"><a href="function.srand.php" class="function">srand()</a></span> は、それぞれ
   <span class="function"><a href="function.mt-rand.php" class="function">mt_rand()</a></span> と <span class="function"><a href="function.mt-srand.php" class="function">mt_srand()</a></span>
   のエイリアスになりました。つまり、
   <span class="function"><a href="function.rand.php" class="function">rand()</a></span>、<span class="function"><a href="function.shuffle.php" class="function">shuffle()</a></span>、
   <span class="function"><a href="function.str-shuffle.php" class="function">str_shuffle()</a></span>、<span class="function"><a href="function.array-rand.php" class="function">array_rand()</a></span>
   の出力がこれまでのバージョンとは変わるということです。
  </p>
 </div>

 <div class="sect2" id="migration71.incompatible.delete-control-character-in-identifiers">
  <h3 class="title">ASCII 制御文字 delete は識別子として使えない</h3>

  <p class="para">
   ASCII 制御文字 delete (<code class="literal">0x7F</code>) は、
   クォートしない限りは識別子として使えなくなりました。
  </p>
 </div>

 <div class="sect2" id="migration71.incompatible.error_log-syslog">
  <h3 class="title">
   <code class="parameter">error_log</code> に <code class="literal">syslog</code> を指定した場合の変更
  </h3>

  <p class="para">
   INI 項目 <code class="parameter">error_log</code> の設定値を
   <code class="literal">syslog</code> にした場合に、PHP のエラーレベルが syslog
   のエラーレベルにマッピングされるようになりました。
   これまでのバージョンではすべてのエラーが notice レベルで記録されていましたが、
   この変更によって、今までよりも細やかな区別ができるようになります。
  </p>
 </div>

 <div class="sect2" id="migration71.incompatible.dont-call-destructors">
  <h3 class="title">未完成のオブジェクトのデストラクタは呼び出されない</h3>

  <p class="para">
   オブジェクトのコンストラクタの実行中に例外がスローされた場合に、
   そのオブジェクトのデストラクタが呼ばれることはなくなりました。
   以前のバージョンでは、場合によっては
   (例: そのオブジェクトが例外バックトレースなどで外部から参照される場合)
   デストラクタが呼ばれることもありました。
  </p>
 </div>

 <div class="sect2" id="migration71.incompatible.call_user_func-with-ref-args">
  <h3 class="title">
   参照渡しの引数の <span class="function"><a href="function.call-user-func.php" class="function">call_user_func()</a></span> での扱い
  </h3>

  <p class="para">
   引数を参照渡しで受け取る関数を <span class="function"><a href="function.call-user-func.php" class="function">call_user_func()</a></span>
   から呼んだときに、例外が発生するようになりました。
   以前のバージョンでは、完全修飾形式の呼び出しであるか否かによってこの場合の挙動が異なっていました。
  </p>
  <p class="para">
   さらにこの場合、<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> は関数呼び出しを中断しなくなりました。
   &quot;expected reference&quot; という警告は出すものの、処理自体はそのまま続行します。
  </p>
 </div>

 <div class="sect2" id="migration71.incompatible.empty-string-index-operator">
  <h3 class="title">
   文字列における空のインデックス演算子はサポートしない
  </h3>

  <p class="para">
   文字列に空のインデックス演算子を適用する (例: <code class="literal">$str[] = $x</code>)
   と、致命的なエラーが発生します。これまでのバージョンではエラーにならず、
   ただ配列に変換されるだけでした。
  </p>
 </div>
 <div class="sect2" id="migration71.incompatible.empty-string-modifcation-by-character">
  <h3 class="title">空文字列に対して、文字列インデックス経由で値を設定する操作</h3>
  <p class="para">
   空文字列に対して、一文字単位で変更する操作が、
   空でない文字列と同じように機能するようになりました。
   つまり、範囲外のオフセットに対する書き込みがスペースで埋められ、
   整数型でない値は整数に変換され、最初の文字だけが採用されるというものです。
   これより前のバージョンでは、黙って空の配列として扱われていました。
   <div class="informalexample">
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$a </span><span style="color: #007700">= </span><span style="color: #DD0000">''</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$a</span><span style="color: #007700">[</span><span style="color: #0000BB">10</span><span style="color: #007700">] = </span><span style="color: #DD0000">'foo'</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 7.0 での出力は、このようになります。</p>
    <div class="example-contents screen">
<div class="cdata"><pre>
array(1) {
  [10]=&gt;
  string(3) &quot;foo&quot;
}
</pre></div>
    </div>
    <p class="para">上の例の PHP 7.1 での出力は、このようになります。</p>
    <div class="example-contents screen">
<div class="cdata"><pre>
string(11) &quot;          f&quot;
</pre></div>
    </div>
   </div>
  </p>
 </div>

 <div class="sect2" id="migration71.incompatible.removed-ini-directives">
  <h3 class="title">削除された INI 項目</h3>

  <p class="para">
   以下の INI 項目は、削除されました。
  </p>

  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara">
     <code class="parameter">session.entropy_file</code>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <code class="parameter">session.entropy_length</code>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <code class="parameter">session.hash_function</code>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <code class="parameter">session.hash_bits_per_character</code>
    </span>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration71.incompatible.array-order">
  <h3 class="title">
   参照による代入で自動的に作られる配列の要素の並び順の変更
  </h3>

  <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 7.0 での出力は、このようになります。</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>
   <p class="para">上の例の PHP 7.1 での出力は、このようになります。</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>
  </div>
 </div>

 <div class="sect2" id="migration71.incompatible.sort-order">
  <h3 class="title">同値な要素の並び順</h3>
  <p class="para">
   内部的なソートアルゴリズムが改良されたことに伴って、
   比較したときに等しいとみなされる要素の並び順が以前とは変わるかもしれません。
  </p>
  <blockquote class="note"><p><strong class="note">注意</strong>: 
   <p class="para">
    同値な要素の並び順に依存するコードは書かないようにしましょう。
    その並び順がいつまでも同じであるとは限りません。
   </p>
  </p></blockquote>
 </div>

 <div class="sect2" id="migration71.incompatible.e-recoverable">
  <h3 class="title">E_RECOVERABLE エラーのエラーメッセージ</h3>
  <p class="para">
   E_RECOVERABLE エラーのエラーメッセージが、
   &quot;Catchable fatal error&quot; から
   &quot;Recoverable fatal error&quot; に変更されました。
  </p>
 </div>

 <div class="sect2" id="migration71.incompatible.unserialize">
  <h3 class="title">unserialize() 関数の $options パラメータ</h3>
  <p class="para">
   <span class="function"><a href="function.unserialize.php" class="function">unserialize()</a></span> 関数の $options パラメータの
   <code class="literal">allowed_classes</code> 要素が、
   型を厳密に解釈するようになりました。
   つまり、<span class="type"><a href="language.types.array.php" class="type array">array</a></span> または <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>
   以外のあらゆる値が与えられても、
   unserialize() は <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> を返し、
   <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong> レベルの警告が発生します。
  </p>
 </div>

 <div class="sect2" id="migration71.incompatible.datetime-microseconds">
  <h3 class="title">DateTime クラスのコンストラクタに、マイクロ秒も組み込まれる</h3>
  <p class="para">
   <span class="classname"><a href="class.datetime.php" class="classname">DateTime</a></span> と <span class="classname"><a href="class.datetimeimmutable.php" class="classname">DateTimeImmutable</a></span>
   は、現在時刻、明示的な時刻、
   または相対時刻を示す文字列
   (例: <code class="literal">&quot;first day of next month&quot;</code>)
   から構築されると、
   マイクロ秒を適切に含めるようになりました。
   これは、新しく生成されたふたつのインスタンスが、<strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> ではなくて
   <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> を返しやすくなったということです。
   <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">new </span><span style="color: #0000BB">DateTime</span><span style="color: #007700">() == new </span><span style="color: #0000BB">DateTime</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

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

 <div class="sect2" id="migration71.incompatible.fatal-errors-to-error-exceptions">
  <h3 class="title">致命的なエラーが <span class="classname"><a href="class.error.php" class="classname">Error</a></span> 例外に変換される</h3>

  <p class="para">
   Date 拡張モジュールでは、
   <span class="classname"><a href="class.datetime.php" class="classname">DateTime</a></span> または <span class="classname"><a href="class.dateperiod.php" class="classname">DatePeriod</a></span>
   クラス のシリアライズデータが不正だったり、
   シリアライズしたデータからタイムゾーンを初期化するのに失敗した場合、
   致命的なエラーにならず、
   <span class="methodname"><strong>__wakeup()</strong></span> や <span class="methodname"><strong>__set_state()</strong></span>
   メソッドから <span class="classname"><a href="class.error.php" class="classname">Error</a></span> 例外をスローするようになりました。
  </p>

  <p class="para">
   DBA 拡張モジュールでは、
   (<span class="function"><a href="function.dba-insert.php" class="function">dba_insert()</a></span> のように)
   データを変更する関数は、キーが正確にふたつの要素を含んでいない場合に
   キャッチ可能な fatal error ではなく、
   <span class="classname"><a href="class.error.php" class="classname">Error</a></span> 例外をスローするようになりました。
  </p>

  <p class="para">
   DOM 拡張モジュールでは、
   不正なスキーマ や RelaxNG検証コンテキスト は
   致命的なエラーにならず、
   <span class="classname"><a href="class.error.php" class="classname">Error</a></span> 例外をスローするようになりました。

   同じように、適切な基底クラスを継承しないノードクラスを登録しようとしたり、
   不正なプロパティを読み出そうとしたり、
   読み込み専用のプロパティに書き込もうとしたりしても、
   同様に <span class="classname"><a href="class.error.php" class="classname">Error</a></span> 例外をスローようになりました。
  </p>

  <p class="para">
   IMAP 拡張モジュールでは、
   16385 バイト以上の email アドレスは、
   致命的なエラーにならず、
   <span class="classname"><a href="class.error.php" class="classname">Error</a></span> 例外をスローするようになりました。
  </p>

  <p class="para">
   Intl 拡張モジュールでは、
   <span class="classname"><a href="class.collator.php" class="classname">Collator</a></span> クラスを継承したクラスで、
   親メソッドを呼ぶ前に親のコンストラクタを呼ぶのに失敗すると、
   回復可能な fatal error にはならず、
   <span class="classname"><a href="class.error.php" class="classname">Error</a></span> 例外をスローするようになりました。

   同様に、<span class="classname"><a href="class.transliterator.php" class="classname">Transliterator</a></span> を clone すると、
   内部の transliterator の複製に失敗した時に
   致命的なエラーにならず、
   <span class="classname"><a href="class.error.php" class="classname">Error</a></span> 例外をスローするようになりました。
  </p>

  <p class="para">
   LDAP 拡張モジュールでは、
   <span class="function"><strong>ldap_batch_modify()</strong></span> 関数に不明な変更タイプを渡すと、
   致命的なエラーにならず、
   <span class="classname"><a href="class.error.php" class="classname">Error</a></span> 例外をスローするようになりました。
  </p>

  <p class="para">
   mbstring 拡張モジュールでは、
   <span class="function"><a href="function.mb-ereg.php" class="function">mb_ereg()</a></span> 関数と
   <span class="function"><a href="function.mb-eregi.php" class="function">mb_eregi()</a></span> 関数が、
   &#039;e&#039; オプションを使い、かつ 不正な PHP の式が渡された場合に
   <span class="classname"><a href="class.parseerror.php" class="classname">ParseError</a></span> 例外をスローするようになりました。
  </p>

  <p class="para">
   Mcrypt 拡張モジュールでは、
   <span class="function"><a href="function.mcrypt-encrypt.php" class="function">mcrypt_encrypt()</a></span> と
   <span class="function"><a href="function.mcrypt-decrypt.php" class="function">mcrypt_decrypt()</a></span> 関数が
   mcrypt を初期化できなかった場合に
   致命的なエラーにならず、
   <span class="classname"><a href="class.error.php" class="classname">Error</a></span> 例外をスローするようになりました。
  </p>

  <p class="para">
   mysqli 拡張モジュールでは、
   不正なプロパティを読み出そうとしたり、
   読み取り専用のプロパティに書き込もうとしたりすると、
   致命的なエラーにならず、
   <span class="classname"><a href="class.error.php" class="classname">Error</a></span> 例外をスローするようになりました。
  </p>

  <p class="para">
   Reflection 拡張モジュールでは、
   リフレクションオブジェクトを取得できなかったり、
   オブジェクトのプロパティを取得できなかったりすると、
   致命的なエラーにならず、
   <span class="classname"><a href="class.error.php" class="classname">Error</a></span> 例外をスローするようになりました。
  </p>

  <p class="para">
   Session 拡張モジュールでは、
   セッションIDに文字列を返さないカスタムのセッションハンドラは、
   セッションIDを生成しなければならない関数を呼んだ際に
   致命的なエラーにならず、
   <span class="classname"><a href="class.error.php" class="classname">Error</a></span> 例外をスローするようになりました。
  </p>

  <p class="para">
   SimpleXML 拡張モジュールでは、
   名前が付いていない、または 重複した属性を作ろうとすると、
   致命的なエラーにならず、
   <span class="classname"><a href="class.error.php" class="classname">Error</a></span> 例外をスローするようになりました。
  </p>

  <p class="para">
   SPL 拡張モジュールでは、
   <span class="classname"><strong class="classname">SplDirectory</strong></span> オブジェクトを
   clone しようとすると、
   致命的なエラーにならず、
   <span class="classname"><a href="class.error.php" class="classname">Error</a></span> 例外をスローするようになりました。

   同じように、オブジェクトを繰り返している時に
   <span class="methodname"><a href="arrayiterator.append.php" class="methodname">ArrayIterator::append()</a></span> を呼び出すと、
   <span class="classname"><a href="class.error.php" class="classname">Error</a></span> 例外をスローするようになりました。
  </p>

  <p class="para">
   standard 拡張モジュールでは、
   <span class="function"><a href="function.assert.php" class="function">assert()</a></span>関数 の
   最初のパラメーターに string 型の引数が与えられた場合、
   かつ PHP のコードが不正だった場合に
   キャッチ可能な致命的なエラーではなく、
   <span class="classname"><a href="class.parseerror.php" class="classname">ParseError</a></span> 例外をスローするようになりました。

   同じように、
   クラススコープの外側から
   <span class="function"><a href="function.forward-static-call.php" class="function">forward_static_call()</a></span> を呼び出すと、
   <span class="classname"><a href="class.error.php" class="classname">Error</a></span> 例外をスローするようになりました。
  </p>

  <p class="para">
   Tidy 拡張モジュールでは、
   <span class="classname"><a href="class.tidynode.php" class="classname">tidyNode</a></span> を手動で作ろうとすると、
   致命的なエラーにならず、
   <span class="classname"><a href="class.error.php" class="classname">Error</a></span> 例外をスローするようになりました。
  </p>

  <p class="para">
   WDDX 拡張モジュールでは、
   シリアライズする時に循環参照が存在すると、
   致命的なエラーにならず、
   <span class="classname"><a href="class.error.php" class="classname">Error</a></span> 例外をスローするようになりました。
  </p>

  <p class="para">
   XML-RPC 拡張モジュールでは、
   シリアライズする時に循環参照が存在すると、
   致命的なエラーにならず、
   <span class="classname"><a href="class.error.php" class="classname">Error</a></span> 例外をスローするようになりました。
  </p>

  <p class="para">
   Zip 拡張モジュールでは、
   glob サポートが利用できない場合、
   <span class="methodname"><a href="ziparchive.addglob.php" class="methodname">ZipArchive::addGlob()</a></span> メソッドは
   致命的なエラーにならず、
   <span class="classname"><a href="class.error.php" class="classname">Error</a></span> 例外をスローするようになりました。
  </p>
 </div>

 <div class="sect2" id="migration71.incompatible.lexical-names">
  <h3 class="title">字句的に束縛される変数は、名前を再利用できない</h3>

  <p class="para">
   <code class="literal">use</code> 経由で <a href="functions.anonymous.php" class="link">クロージャ</a> 
   に束縛された変数名には、<a href="language.variables.predefined.php" class="link">スーパーグローバル</a> や
   <var class="varname">$this</var> またはあらゆるパラメータ と同じ名前が使えなくなりました。
   たとえば、次のような関数定義はすべて致命的なエラーが発生します。
   <div class="informalexample">
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$f </span><span style="color: #007700">= function () use (</span><span style="color: #0000BB">$_SERVER</span><span style="color: #007700">) {};<br /></span><span style="color: #0000BB">$f </span><span style="color: #007700">= function () use (</span><span style="color: #0000BB">$this</span><span style="color: #007700">) {};<br /></span><span style="color: #0000BB">$f </span><span style="color: #007700">= function (</span><span style="color: #0000BB">$param</span><span style="color: #007700">) use (</span><span style="color: #0000BB">$param</span><span style="color: #007700">) {};</span></span></code></div>
    </div>

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

 <div class="sect2" id="migration71.incompatible.long2ip">
  <h3 class="title">long2ip() のパラメータタイプの変更</h3>
  <p class="para">
   <span class="function"><a href="function.long2ip.php" class="function">long2ip()</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>

 <div class="sect2" id="migration71.incompatible.json">
  <h3 class="title">JSON のエンコードとデコード</h3>
  <p class="para">
   <code class="parameter">serialize_precision</code> ini 設定が、
   <span class="type"><a href="language.types.float.php" class="type float">float</a></span> 型の値をエンコードするときに、
   シリアル化の精度を制御するようになりました。
  </p>
  <p class="para">
   空のキーをデコードすると、
   プロパティ名が <code class="literal">_empty_</code> ではなく、空のプロパティ名になります。
   <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">json_decode</span><span style="color: #007700">(</span><span style="color: #0000BB">json_encode</span><span style="color: #007700">([</span><span style="color: #DD0000">'' </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">1</span><span style="color: #007700">])));</span></span></code></div>
   </div>

   <p class="para">上の例の出力は、
たとえば以下のようになります。</p>
   <div class="example-contents screen">
<div class="cdata"><pre>
object(stdClass)#1 (1) {
  [&quot;&quot;]=&gt;
  int(1)
}
</pre></div>
   </div>
  </div>
  </p>
  <p class="para">
   <span class="function"><a href="function.json-encode.php" class="function">json_encode()</a></span> 関数に
   <strong><code><a href="json.constants.php#constant.json-unescaped-unicode">JSON_UNESCAPED_UNICODE</a></code></strong> フラグを渡すと、
   U+2028 および U+2029 がエスケープされるようになりました。
  </p>
 </div>

 <div class="sect2" id="migration71.incompatible.mbstring">
  <h3 class="title">
   <span class="function"><a href="function.mb-ereg.php" class="function">mb_ereg()</a></span> および <span class="function"><a href="function.mb-eregi.php" class="function">mb_eregi()</a></span>
   関数のパラメータのセマンティクスの変更
  </h3>
  <p class="para">
   <span class="function"><a href="function.mb-ereg.php" class="function">mb_ereg()</a></span> 関数 と
   <span class="function"><a href="function.mb-eregi.php" class="function">mb_eregi()</a></span> 関数
   の第3パラメータ (<code class="parameter">regs</code>) は、
   マッチするものがなかった場合、空の配列が設定されるようになりました。
   これより前のバージョンでは、このパラメータは変更されませんでした。
  </p>
 </div>

 <div class="sect2" id="migration71.incompatible.openssl">
  <h3 class="title">sslv2 ストリームのサポートの削除</h3>
  <p class="para">
   sslv2 ストリーム が OpenSSL から削除されました。
  </p>
 </div>

 <div class="sect2" id="migration71.incompatible.typed-returns-compile-time">
  <h3 class="title">戻り値の型が決まっている関数で &quot;return;&quot; と書いてもコンパイルエラーになる</h3>
  <p class="para">
   戻り値の型を宣言している関数内で、引数がないreturn文を使うと、
   (戻り値の型を <span class="type"><span class="type"><a href="language.types.void.php" class="type void">void</a></span></span> と宣言していない場合)
   <strong><code><a href="errorfunc.constants.php#constant.e-compile-error">E_COMPILE_ERROR</a></code></strong> が発生するようになりました。
   これは、そのreturn文に到達しない場合であっても同じです。
  </p>
 </div>

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