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

contributors($setup);

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

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

  <div class="sect3" id="migration74.incompatible.core.non-array-access">
   <h4 class="title">配列でない値を配列スタイルでアクセスした場合</h4>

   <p class="para">
    <span class="type"><a href="language.types.null.php" class="type null">null</a></span>, <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>,
    <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.resource.php" class="type resource">resource</a></span>
    型を (<code class="literal">$null[&quot;key&quot;]</code> のように)
    配列としてアクセスしようとすると、警告が生成されるようになりました。
   </p>
  </div>

  <div class="sect3" id="migration74.incompatible.core.get-declared-classes">
   <h4 class="title"><span class="function"><a href="function.get-declared-classes.php" class="function">get_declared_classes()</a></span> 関数</h4>

   <p class="para">
    <span class="function"><a href="function.get-declared-classes.php" class="function">get_declared_classes()</a></span>
    関数は、まだインスタンス化されていない無名クラスを返さなくなりました。
   </p>
  </div>

  <div class="sect3" id="migration74.incompatible.core.fn">
   <h4 class="title"><code class="literal">fn</code> キーワード</h4>

   <p class="para">
    <code class="literal">fn</code>
    は、予約語になりました。特に、関数名やクラス名として使うことはできなくなりました。メソッド名やクラスの定数名の場合は使用できます。
   </p>
  </div>

  <div class="sect3" id="migration74.incompatible.core.php-tag">
   <h4 class="title">ファイルの最後の <code class="literal">&lt;?php</code> タグ</h4>

   <p class="para">
    ファイルの最後の (改行が最後に付かない) <code class="literal">&lt;?php</code>
    タグは、PHPタグの開始タグとして解釈されるようになりました。以前は、短縮型の開始タグ <code class="literal">&lt;?</code> の後にリテラル
    <code class="literal">php</code>
    を続けたものとして解釈された結果文法エラーになる (<code class="literal">short_open_tag=1</code>
    の場合) か、<code class="literal">&lt;?php</code> という文字列リテラルとして解釈されていました (<code class="literal">short_open_tag=0</code>
    の場合) 。
   </p>
  </div>

  <div class="sect3" id="migration74.incompatible.core.stream-wrappers">
   <h4 class="title">ストリームラッパー</h4>

   <p class="para">
    ストリーム上で include/require
    を使う場合、<span class="methodname"><a href="streamwrapper.stream-set-option.php" class="methodname">streamWrapper::stream_set_option()</a></span> が
    <strong><code><a href="stream.constants.php#constant.stream-option-read-buffer">STREAM_OPTION_READ_BUFFER</a></code></strong>
    オプション付きで呼び出されるようになります。カスタムのストリームラッパーの実装は
    警告を回避するために <span class="methodname"><a href="streamwrapper.stream-set-option.php" class="methodname">streamWrapper::stream_set_option()</a></span>
    を実装する必要があるかもしれません (不十分な実装に対しては常に <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>
    を返します)
   </p>
  </div>

  <div class="sect3" id="migration74.incompatible.core.serialization">
   <h4 class="title">シリアル化</h4>

   <p class="para">
    シリアル化フォーマット <code class="literal">o</code> は削除されました。
    PHP
    によって生成されなくなるので、手動で組まれた文字列のシリアル化を復元する場合のみ、壊れる場合があります。
   </p>
  </div>

  <div class="sect3" id="migration74.incompatible.core.password-algorithm-constants">
   <h4 class="title">パスワードアルゴリズムの定数</h4>

   <p class="para">
    パスワードハッシュのアルゴリズムの識別子は、数値型ではなく、nullable
    な文字列型になりました。
   </p>

   <ul class="itemizedlist">
    <li class="listitem">
     <span class="simpara">
      <strong><code><a href="password.constants.php#constant.password-default">PASSWORD_DEFAULT</a></code></strong> は int型の 1 でしたが、
      string の &#039;2y&#039; になりました。
      (PHP 7.4.0, 7.4.1, 7.4.2 では <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="password.constants.php#constant.password-bcrypt">PASSWORD_BCRYPT</a></code></strong> は int型の 1 でしたが、string の
      &#039;2y&#039; になりました。
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      <strong><code><a href="password.constants.php#constant.password-argon2i">PASSWORD_ARGON2I</a></code></strong> は int型の 2 でしたが、string の
      &#039;argon2i&#039; になりました。
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      <strong><code><a href="password.constants.php#constant.password-argon2id">PASSWORD_ARGON2ID</a></code></strong> は int型の 3 でしたが、string の
      &#039;argon2id&#039; になりました。
     </span>
    </li>
   </ul>

   <p class="para">
    PASSWORD_DEFAULT,
    PASSWORD_BCRYPT, PASSWORD_ARGON2I, および PASSWORD_ARGON2ID
    定数を正しく使っているアプリケーションは、正しく動作し続けるはずです。
   </p>
  </div>

  <div class="sect3" id="migration74.incompatible.core.htmlentities">
   <h4 class="title"><span class="function"><a href="function.htmlentities.php" class="function">htmlentities()</a></span> 関数</h4>

   <p class="para">
    <span class="function"><a href="function.htmlentities.php" class="function">htmlentities()</a></span> 関数は
    基本的なエンティティ置換だけをサポートしているエンコーディングで使われた場合、 (E_STRICT
    ではなく) E_NOTICE を発生させるようになりました。E_NOTICE
    が発生するのは、<span class="function"><a href="function.htmlspecialchars.php" class="function">htmlspecialchars()</a></span> の場合と同等です。
   </p>
  </div>

  <div class="sect3" id="migration74.incompatible.core.fread-fwrite">
   <h4 class="title"><span class="function"><a href="function.fread.php" class="function">fread()</a></span> および <span class="function"><a href="function.fwrite.php" class="function">fwrite()</a></span> 関数</h4>

   <p class="para">
    <span class="function"><a href="function.fread.php" class="function">fread()</a></span> と <span class="function"><a href="function.fwrite.php" class="function">fwrite()</a></span>
    関数は、操作に失敗した場合に <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>
    を返すようになりました。以前は空文字列か 0
    を返していました。EAGAIN/EWOULDBLOCK は、失敗と見做されません。
   </p>
   <p class="para">
    これらの関数は、読み取り専用のリソースに書き込もうとして失敗したような場合に E_NOTICE を発生させるようになりました。
   </p>
  </div>

 </div>

 <div class="sect2" id="migration74.incompatible.bcmath">
  <h3 class="title">BCMath</h3>

  <p class="para">
   BCMath 関数は、<code class="literal">&quot;32foo&quot;</code>
   のような不完全な数値が渡された場合に警告を生成するようになりました。以前はそうした引数は0として解釈されていました。
  </p>
 </div>

 <div class="sect2" id="migration74.incompatible.curl">
  <h3 class="title">CURL</h3>

  <p class="para">
   <span class="classname"><a href="class.curlfile.php" class="classname">CURLFile</a></span>
   をシリアル化しようとすると、例外が発生するようになりました。以前は、シリアル化を復元しようとした場合のみ、例外が発生していました。
  </p>
  <p class="para">
   <strong><code><a href="curl.constants.php#constant.curlpipe-http1">CURLPIPE_HTTP1</a></code></strong> は非推奨になり、cURL 7.62.0
   からサポートされなくなりました。
  </p>
  <p class="para">
   <span class="function"><a href="function.curl-version.php" class="function">curl_version()</a></span> 関数の <code class="literal">$version</code>
   引数は推奨されません。デフォルトの
   <strong><code><a href="curl.constants.php#constant.curlversion-now">CURLVERSION_NOW</a></code></strong>
   以外の値が渡された場合、警告が生成され、渡された引数は無視されます。
  </p>
 </div>

 <div class="sect2" id="migration74.incompatible.datetime">
  <h3 class="title">日付と時刻</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>
   のインスタンスに対して <span class="function"><a href="function.var-dump.php" class="function">var_dump()</a></span>
   類似の関数を呼び出しても、オブジェクトでアクセス可能なプロパティのみを表示するようになりました。
  </p>
  <p class="para">
   <span class="classname"><a href="class.dateinterval.php" class="classname">DateInterval</a></span> オブジェクトを (
   <code class="literal">==</code>, <code class="literal">&lt;</code> などを使って)
   比較した場合、警告が出て常に <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>
   が返されるようになりました。以前は、プロパティがない場合、全ての
   <span class="classname"><a href="class.dateinterval.php" class="classname">DateInterval</a></span>
   オブジェクトが等しいと見做されていました。
  </p>
 </div>

 <div class="sect2" id="migration74.incompatible.intl">
  <h3 class="title">国際化関数</h3>

  <p class="para">
   <span class="function"><a href="function.idn-to-ascii.php" class="function">idn_to_ascii()</a></span> と <span class="function"><a href="function.idn-to-utf8.php" class="function">idn_to_utf8()</a></span>
   関数のデフォルト値は、非推奨の <strong><code><a href="intl.constants.php#constant.intl-idna-variant-2003">INTL_IDNA_VARIANT_2003</a></code></strong>
   ではなく <strong><code><a href="intl.constants.php#constant.intl-idna-variant-uts46">INTL_IDNA_VARIANT_UTS46</a></code></strong> となりました。
  </p>
 </div>

 <div class="sect2" id="migration74.incompatible.mysqli">
  <h3 class="title">MySQLi</h3>

  <p class="para">
   組み込みサーバーの機能は削除されました。少なくとも PHP 7.0
   以降、この機能は壊れていました。
  </p>
  <p class="para">
   ドキュメントに書かれていない <code class="literal">mysqli::$stat</code>
   プロパティは削除され、<span class="methodname"><a href="mysqli.stat.php" class="methodname">mysqli::stat()</a></span>
   に置き換えられました。
  </p>
 </div>

 <div class="sect2" id="migration74.incompatible.openssl">
  <h3 class="title">OpenSSL</h3>

  <p class="para">
   <span class="function"><a href="function.openssl-random-pseudo-bytes.php" class="function">openssl_random_pseudo_bytes()</a></span>
   関数は、エラーが発生した場合に例外をスローするようになりました。<span class="function"><a href="function.random-bytes.php" class="function">random_bytes()</a></span>
   関数も同じです。
   特に、リクエストされたバイト数が0以下の場合には、
   <span class="classname"><a href="class.error.php" class="classname">Error</a></span>
   がスローされ、十分なランダム性が得られなかった場合は
   <span class="classname"><a href="class.exception.php" class="classname">Exception</a></span> が生成されます。
   <code class="literal">$crypto_strong</code> の出力引数は、
   例外がスローされなかった場合は常に <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>
   であることが保証されるので、明示的なチェックは不要です。
  </p>
 </div>

 <div class="sect2" id="migration74.incompatible.pcre">
  <h3 class="title">Regular Expressions (Perl互換)</h3>

  <p class="para">
   <strong><code><a href="pcre.constants.php#constant.preg-unmatched-as-null">PREG_UNMATCHED_AS_NULL</a></code></strong>
   モードが使われた場合、後に続くマッチしなかったキャプチャグループにも <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>
   (offset キャプチャが有効になっていた場合は
   <code class="literal">[null, -1]</code> になります) が設定されるようになりました。
   これは、<code class="literal">$matches</code>
   のサイズが常に同じになることを意味します。
  </p>
 </div>

 <div class="sect2" id="migration74.incompatible.pdo">
  <h3 class="title">PDO</h3>

  <p class="para">
   <span class="classname"><a href="class.pdo.php" class="classname">PDO</a></span> や <span class="classname"><a href="class.pdostatement.php" class="classname">PDOStatement</a></span>
   のインスタンスをシリアル化しようとすると、<span class="classname"><a href="class.pdoexception.php" class="classname">PDOException</a></span>
   ではなく <span class="classname"><a href="class.exception.php" class="classname">Exception</a></span>
   が生成されるようになりました。これは、シリアル化をサポートしていない他の内部的なクラスと一貫した挙動です。
  </p>

  <p class="para">
   <span class="classname"><a href="class.reflectionclassconstant.php" class="classname">ReflectionClassConstant</a></span>,
   <span class="classname"><a href="class.reflectionmethod.php" class="classname">ReflectionMethod</a></span>, <span class="classname"><a href="class.reflectionproperty.php" class="classname">ReflectionProperty</a></span> のクラス定数の値が変更されました。
  </p>
 </div>

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

  <p class="para">
   リフレクションオブジェクトをシリアル化しようとすると、例外を生成するようになりました。リフレクションオブジェクトのシリアル化はこれまでサポートされたことはなく、壊れたリフレクションオブジェクトを返していました。このバージョンから、明示的に禁止されました。
  </p>
 </div>

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

  <p class="para">
   <span class="classname"><a href="class.arrayobject.php" class="classname">ArrayObject</a></span> インスタンスに対して
   <span class="function"><a href="function.get-object-vars.php" class="function">get_object_vars()</a></span>
   関数を呼ぶと、<span class="classname"><a href="class.arrayobject.php" class="classname">ArrayObject</a></span>
   そのもの(またはそのサブクラス)
   のプロパティを常に返すようになりました。以前は、<strong><code><a href="class.arrayobject.php#arrayobject.constants.std-prop-list">ArrayObject::STD_PROP_LIST</a></code></strong>
   フラグが指定されない限り、ラップされた 配列/オブジェクト
   の値を返していました。
  </p>
  <p class="para">
   他に影響を受ける操作として、以下が挙げられます:
  </p>
  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara">
     <span class="methodname"><strong>ReflectionObject::getProperties()</strong></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><a href="function.reset.php" class="function">reset()</a></span>, <span class="function"><a href="function.current.php" class="function">current()</a></span> など。
     <span class="interfacename"><a href="class.iterator.php" class="interfacename">Iterator</a></span>
     メソッドを代わりに使ってください。
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     オブジェクトのプロパティをリストとして扱うその他の操作も、影響を受ける可能性があります。
     たとえば <span class="function"><a href="function.array-walk.php" class="function">array_walk()</a></span> 関数が挙げられます。
    </span>
   </li>
  </ul>
  <p class="para">
   <code class="literal">(array)</code>
   キャストは影響を受けません。この操作は引き続き、ラップされた配列を返すか、<span class="classname"><a href="class.arrayobject.php" class="classname">ArrayObject</a></span>
   のプロパティを返します。これは、<strong><code><a href="class.arrayobject.php#arrayobject.constants.std-prop-list">ArrayObject::STD_PROP_LIST</a></code></strong>
   フラグが指定されたかどうかによって異なります。
  </p>
  <p class="para">
   <span class="methodname"><a href="splpriorityqueue.setextractflags.php" class="methodname">SplPriorityQueue::setExtractFlags()</a></span>
   は、0を渡された場合に例外をスローするようになりました。以前は、次の配列を展開する操作の際に回復可能な致命的なエラーを生成していました。
  </p>
  <p class="para">
   <span class="classname"><a href="class.arrayobject.php" class="classname">ArrayObject</a></span>, <span class="classname"><a href="class.arrayiterator.php" class="classname">ArrayIterator</a></span>,
   <span class="classname"><a href="class.spldoublylinkedlist.php" class="classname">SplDoublyLinkedList</a></span> および
   <span class="classname"><a href="class.splobjectstorage.php" class="classname">SplObjectStorage</a></span>
   は、<span class="interfacename"><a href="class.serializable.php" class="interfacename">Serializable</a></span> に加えて、新たに
   <code class="literal">__serialize()</code> と <code class="literal">__unserialize()</code>
   機構をサポートしました。
   これによって、古いPHPバージョンでシリアル化されたペイロードはまだ復元可能であることを意味しますが、PHP
   7.4
   で生成された新しいペイロードを、古いバージョンは理解しないことを意味します。
  </p>
 </div>

 <div class="sect2" id="migration74.incompatible.tokenizer">
  <h3 class="title">Tokenizer</h3>

  <p class="para">
   <span class="function"><a href="function.token-get-all.php" class="function">token_get_all()</a></span>
   関数は、トークンストリームに穴を開けるのではなく、<strong><code><a href="tokens.php#constant.t-bad-character">T_BAD_CHARACTER</a></code></strong>
   トークンを生成するようになりました。
  </p>
 </div>

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

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

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