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

contributors($setup);

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

 <div class="sect2" id="migration73.incompatible.core">
  <h3 class="title">PHP コア</h3>

  <div class="sect3" id="migration73.incompatible.core.heredoc-nowdoc">
   <h4 class="title">ヒアドキュメント/Nowdoc の終了ラベルの解釈</h4>

   <p class="para">
    <a href="migration73.new-features.php#migration73.new-features.core.heredoc" class="link">ヒアドキュメント/Nowdoc
    の文法が柔軟になった</a> ことにより、本体の内部に終了ラベルが含まれた
    ドキュメンテーション文字列は、エラーが発生するか、解釈の振る舞いが変わる可能性があります。
    たとえば、以下のような場合です: <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">= &lt;&lt;&lt;FOO<br /></span><span style="color: #DD0000">abcdefg<br /></span><span style="color: #007700">   FOO<br /></span><span style="color: #0000BB">FOO</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
    インデントされた <code class="literal">FOO</code>
    が入ったとしても、以前は特別な意味は何もありませんでした。
    ですが、このバージョンからは ヒアドキュメントの終了と解釈され、
    後に続く <code class="literal">FOO;</code> が syntax error になるでしょう。
    この問題は、文字列の内容に決して含まれることのない終了ラベルを選ぶことで常に回避できます。
   </p>
  </div>

  <div class="sect3" id="migration73.incompatible.core.continue-targeting-switch">
   <h4 class="title">switch の制御フローを変更する continue 文は警告が出る</h4>

   <p class="para">
    <code class="literal">switch</code> の制御フローを変更することを狙った 
    <code class="literal">continue</code> 文は、警告が出るようになりました。
    PHP では、このような <code class="literal">continue</code> 文は
    <code class="literal">break</code> と同等で、他のプログラミング言語では
    <code class="literal">continue 2</code> と同じように振る舞うのとは対照的です。
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">while (</span><span style="color: #0000BB">$foo</span><span style="color: #007700">) {<br />    switch (</span><span style="color: #0000BB">$bar</span><span style="color: #007700">) {<br />      case </span><span style="color: #DD0000">"baz"</span><span style="color: #007700">:<br />         continue;<br />         </span><span style="color: #FF8000">// Warning: "continue" targeting switch is equivalent to<br />         //          "break". Did you mean to use "continue 2"?<br />   </span><span style="color: #007700">}<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

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

  <div class="sect3" id="migration73.incompatible.core.arrayaccess">
   <h4 class="title">ArrayAccess を実装したオブジェクトに対する、
   数値形式の文字列キーの解釈が厳密に</h4>

   <p class="para">
    <code class="literal">$obj</code> が <span class="classname"><a href="class.arrayaccess.php" class="classname">ArrayAccess</a></span>
    を実装したオブジェクトで、
    <code class="literal">&quot;123&quot;</code> が数値の文字列リテラルだった場合、
    この <code class="literal">&quot;123&quot;</code>
    は暗黙のうちに整数型に変換されなくなりました。
    つまり、<code class="literal">$obj-&gt;offsetGet(123)</code> ではなく、
    <code class="literal">$obj-&gt;offsetGet(&quot;123&quot;)</code> がコールされるようになります。
    これは、リテラルでない値の既存の振る舞いに一致します。
    配列の振る舞いには全く影響しません。
    配列については、数値の文字列リテラルのキーは、整数型に暗黙のうちに変換され続けます。
   </p>
  </div>

  <div class="sect3" id="migration73.incompatible.core.static-properties">
   <h4 class="title">static なプロパティが参照の代入によって分裂しなくなった</h4>

   <p class="para">
    PHP では、子クラスで明示的にオーバーライドされない限り、static
    なプロパティが継承関係にあるクラスの間で共有されます。しかし、
    実装上の副作用により、参照を代入することによって、static
    なプロパティが異なる値になる可能性がありました。こうした抜け穴がこのバージョンでは修正されました。
    <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">Test </span><span style="color: #007700">{<br />    public static </span><span style="color: #0000BB">$x </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;<br />}<br />class </span><span style="color: #0000BB">Test2 </span><span style="color: #007700">extends </span><span style="color: #0000BB">Test </span><span style="color: #007700">{ }<br /><br /></span><span style="color: #0000BB">Test2</span><span style="color: #007700">::</span><span style="color: #0000BB">$x </span><span style="color: #007700">= &amp;</span><span style="color: #0000BB">$x</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$x </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">Test</span><span style="color: #007700">::</span><span style="color: #0000BB">$x</span><span style="color: #007700">, </span><span style="color: #0000BB">Test2</span><span style="color: #007700">::</span><span style="color: #0000BB">$x</span><span style="color: #007700">);<br /></span><span style="color: #FF8000">// Previously: int(0), int(1)<br />// Now:        int(1), int(1)<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

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

  <div class="sect3" id="migration73.incompatible.core.reference-unwrapping">
   <h4 class="title">配列から返される参照とプロパティのアクセスは、即座に分割される</h4>

   <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 />$arr </span><span style="color: #007700">= [</span><span style="color: #0000BB">1</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">$ref </span><span style="color: #007700">=&amp; </span><span style="color: #0000BB">$arr</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">$arr</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">] + (</span><span style="color: #0000BB">$arr</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">] = </span><span style="color: #0000BB">2</span><span style="color: #007700">));<br /></span><span style="color: #FF8000">// Previously: int(4), Now: int(3)<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
    これにより、参照と参照でない値の振る舞いが一貫したものになります。
    単一の式の中で値を読んだり書いたりする場合の振る舞いは未定義のままであり、
    将来再び動作が変更される可能性があることに注意して下さい。
   </p>
  </div>

  <div class="sect3" id="migration73.incompatible.core.traversable-unpacking">
   <h4 class="title">Traversable
   への引数のアンパックを整数でないキーで行うことはサポートされない</h4>

   <p class="para">
    <span class="classname"><a href="class.traversable.php" class="classname">Traversable</a></span>
    への引数のアンパックを整数でないキーで行うコードは動作しなくなりました。
    次のようなコードが、 PHP 5.6 から 7.2 の間は偶然動いていました。
    <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">$args</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$args</span><span style="color: #007700">);<br />}<br />function </span><span style="color: #0000BB">gen</span><span style="color: #007700">() {<br />    yield </span><span style="color: #0000BB">1.23 </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">123</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">foo</span><span style="color: #007700">(...</span><span style="color: #0000BB">gen</span><span style="color: #007700">());<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

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

  <div class="sect3" id="migration73.incompatible.core.misc">
   <h4 class="title">その他雑多な変更</h4>

   <p class="para">
    <var class="filename">ext_skel</var> ユーティリティは、
    新しいオプションで完全に再設計され、いくつかの古いオプションは削除されました。
    このユーティリティは、PHP
    で書かれており、それ以外の外部への依存はありません。
   </p>

   <p class="para">
    BeOS のサポートが削除されました。
   </p>

   <p class="para">
    <code class="literal">EH_THROW</code> モードの、警告を自動的に例外に変換することで
    スローされる例外(e.g. いくつかの <span class="classname"><a href="class.datetime.php" class="classname">DateTime</a></span> 例外)
    は、<span class="function"><a href="function.error-get-last.php" class="function">error_get_last()</a></span> 関数の状態を収集しなくなりました。
    そうした例外は、手動でスローされる例外と同じように動くようになります。
   </p>

   <p class="para">
    <span class="classname"><a href="class.typeerror.php" class="classname">TypeError</a></span> は、<code class="literal">integer</code> と
    <code class="literal">boolean</code> ではなく、 
    それぞれ <code class="literal">int</code> と <code class="literal">bool</code>
    を誤った型として報告するようになります。
   </p>

   <p class="para">
    <span class="function"><a href="function.compact.php" class="function">compact()</a></span>
    関数に渡された未定義の値は、NOTICEレベルの警告を発生させるようになります。
   </p>

   <p class="para">
    <span class="function"><a href="function.getimagesize.php" class="function">getimagesize()</a></span> 関数と関連する関数は、BMP画像の MIME Type
    を <code class="literal">image/x-ms-bmp</code> ではなく
    <code class="literal">image/bmp</code> と報告するようになりました。
    なぜなら、後者は IANA に登録されているから (<a href="https://datatracker.ietf.org/doc/html/rfc7903" class="link external">&raquo;&nbsp;RFC 7903</a> を参照) です。
   </p>

   <p class="para">
    <span class="function"><a href="function.stream-socket-get-name.php" class="function">stream_socket_get_name()</a></span> 関数は、
    ブラケットでラップされた IPv6 アドレスを返すようになります。
    たとえば、<code class="literal">&quot;::1:1337&quot;</code> ではなく、
    <code class="literal">&quot;[::1]:1337&quot;</code> を返すようになるでしょう。
   </p>
  </div>
 </div>

 <div class="sect2" id="migration73.incompatible.bc">
  <h3 class="title">BCMath</h3>

  <p class="para">
   <a href="ref.bc.php" class="link">BCMath 関数</a> でスローされる全ての例外は、
   PHP のエラーハンドリングの機構を使うようになりました。
   以前は、いくつかのエラーが stderr に直接出力されていました。
  </p>

  <p class="para">
   <span class="function"><a href="function.bcmul.php" class="function">bcmul()</a></span> および <span class="function"><a href="function.bcpow.php" class="function">bcpow()</a></span>
   関数は、指定された精度の数値を返すようになりました。
   以前は、返される値の後ろが、0埋めされることで省略される可能性がありました。
  </p>
 </div>

 <div class="sect2" id="migration73.incompatible.imap">
  <h3 class="title">IMAP, POP3 および NNTP</h3>

  <p class="para">
   <strong class="command">rsh</strong>/<strong class="command">ssh</strong>
   ログインはデフォルトで無効になりました。
   これらを有効にしたい場合、<a href="imap.configuration.php#ini.imap.enable-insecure-rsh" class="link">imap.enable_insecure_rsh</a>
   を使って下さい。
   IMAPライブラリは <strong class="command">rsh</strong>/<strong class="command">ssh</strong>
   コマンドに渡す前にメールボックス名をフィルタしないので、
   <strong class="command">rsh</strong>/<strong class="command">ssh</strong> を有効にした状態で
   この関数に信頼できないデータを渡すことは安全ではありません。
  </p>
 </div>

 <div class="sect2" id="migration73.incompatible.mbstring">
  <h3 class="title">マルチバイト文字列</h3>

  <p class="para">
    名前付きキャプチャのサポートが追加されたことにより、
    <code class="literal">mb_ereg_*()</code>
    におけるパターンに名前付きキャプチャを使うと、これまでと異なる振る舞いをします。
    特に、名前付きキャプチャが matches の一部になった場合、
    <span class="function"><a href="function.mb-ereg-replace.php" class="function">mb_ereg_replace()</a></span> はこれを追加の文法に従って解釈します。
    さらに詳しい情報は、<a href="migration73.new-features.php#migration73.new-features.mbstring.named-captures" class="link">名前付きキャプチャ
    </a> を参照ください。
  </p>
 </div>

 <div class="sect2" id="migration73.incompatible.mysqli">
  <h3 class="title">MySQL 改良版拡張モジュール</h3>

  <p class="para">
   プリペアドステートメント が、カラムに小数の桁数を指定する(e.g.
   マイクロ秒を使う場合 <code class="literal">TIMESTAMP(6)</code> のようにする)
   ことによって、 <code class="literal">DATETIME</code>, <code class="literal">TIME</code> および
   <code class="literal">TIMESTAMP</code> 型の秒の小数部を報告するようになりました。
   以前のバージョンでは、秒の小数部は戻り値から単に省略されていました。
  </p>
 </div>

 <div class="sect2" id="migration73.incompatible.pdo-mysql">
  <h3 class="title">MySQL関数 (PDO_MYSQL)</h3>

  <p class="para">
   プリペアドステートメント が、カラムに小数の桁数を指定する(e.g.
   マイクロ秒を使う場合 <code class="literal">TIMESTAMP(6)</code> のようにする)
   ことによって、<code class="literal">DATETIME</code>, <code class="literal">TIME</code> および
   <code class="literal">TIMESTAMP</code> 型の秒の小数部を報告するようになりました。
   以前のバージョンでは、秒の小数部は戻り値から単に省略されていました。
   この変更は、<a href="ref.pdo-mysql.php" class="link">PDO_MYSQL</a>
   のプリペアドステートメントをエミュレートする機能を無効にしていた場合
   (e.g つまり、MySQLネイティブなプリペアの機能を使っていた場合)
   にのみ影響があることに注意して下さい。
   <strong><code><a href="pdo.constants.php#pdo.constants.attr-emulate-prepares">PDO::ATTR_EMULATE_PREPARES</a></code></strong>=<strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>
   (これはデフォルトです) にした接続を使う Statement は影響を受けず、
   既に適切な秒の小数部をエンジンから取得していました。
  </p>
 </div>

 <div class="sect2" id="migration73.incompatible.reflection">
  <h3 class="title">リフレクション</h3>

  <p class="para">
   <a href="book.reflection.php" class="link">リフレクション</a>
   を文字列にエクスポートした場合、<code class="literal">integer</code> と
   <code class="literal">boolean</code> ではなく、<code class="literal">int</code> と
   <code class="literal">bool</code> をそれぞれ使うようになりました。
  </p>
 </div>

 <div class="sect2" id="migration73.incompatible.spl">
  <h3 class="title">Standard PHP Library (SPL)</h3>

  <p class="para">
   <a href="book.spl.php" class="link">SPL</a> autoloader が例外をスローした場合、後に続く
   autoloader は実行されなくなりました。以前は、全ての autoloader
   が実行され、例外がチェインしていました。
  </p>
 </div>

 <div class="sect2" id="migration73.incompatible.simplexml">
  <h3 class="title">SimpleXML</h3>

  <p class="para">
   数学的な演算 に <a href="book.simplexml.php" class="link">SimpleXML</a>
   オブジェクトが含まれていた場合、テキストが <span class="type"><a href="language.types.integer.php" class="type int">int</a></span> または
   <span class="type"><a href="language.types.float.php" class="type float">float</a></span> のうち、より適切なものとして扱われるようになりました。
   以前は値が意図せず <span class="type"><a href="language.types.integer.php" class="type int">int</a></span> として扱われた場合がありました。
  </p>
 </div>

 <div class="sect2" id="migration73.incompatible.cookie-decode">
  <h3 class="title">外部から入力されるCookie</h3>

  <p class="para">
   PHP 7.3.23 以降は、セキュリティ上の理由により、
   外部から入力される Cookie の
   <em>名前</em> はurlデコードされなくなりました。
  </p>
 </div>

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