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

contributors($setup);

?>
<div id="migration80.deprecated" class="sect1">
 <h2 class="title">推奨されなくなる機能</h2>

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

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     デフォルト値を持つパラメータの後に、必須のパラメータが続く場合、デフォルト値は意味をなしません。
     こうした書き方は PHP 8.0.0 から推奨されなくなります。
     以下のようにしてデフォルト値を削除することで、機能を変更することなく解決できます:
    </p>
    <p class="para">
     <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">$a </span><span style="color: #007700">= [], </span><span style="color: #0000BB">$b</span><span style="color: #007700">) {} </span><span style="color: #FF8000">// 変更前<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">test</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: #FF8000">// 変更後<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </p>
    <p class="para">
     このルールの唯一の例外は、<code class="code">Type $param = null</code> と書かれたパラメータです。
     null をデフォルトにすることは、型が暗黙のうちに nullable であることを示しています。
     この書き方はまだ許可されていますが、以下のようにして 明示的に nullable 型を使うことを推奨します:
    </p>
    <p class="para">
     <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">A $a </span><span style="color: #007700">= </span><span style="color: #0000BB">null</span><span style="color: #007700">, </span><span style="color: #0000BB">$b</span><span style="color: #007700">) {} </span><span style="color: #FF8000">// まだ許可されています<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">test</span><span style="color: #007700">(?</span><span style="color: #0000BB">A $a</span><span style="color: #007700">, </span><span style="color: #0000BB">$b</span><span style="color: #007700">) {}       </span><span style="color: #FF8000">// 推奨される書き方<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <code class="parameter">exclude_disabled</code> を明示的に <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> に指定して
     <span class="function"><a href="function.get-defined-functions.php" class="function">get_defined_functions()</a></span> 関数を呼び出すことは推奨されなくなり、
     結果として何も起きなくなりました。
     <span class="function"><a href="function.get-defined-functions.php" class="function">get_defined_functions()</a></span> 関数は無効な関数を返さなくなっています。
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.deprecated.enchant">
  <h3 class="title">Enchant</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.enchant-broker-set-dict-path.php" class="function">enchant_broker_set_dict_path()</a></span> と
     <span class="function"><a href="function.enchant-broker-get-dict-path.php" class="function">enchant_broker_get_dict_path()</a></span> 関数は推奨されません。
     これらの機能は libenchant &lt; 1.5 や libenchant-2 では既に利用できないからです。
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.enchant-dict-add-to-personal.php" class="function">enchant_dict_add_to_personal()</a></span> は推奨されません。
     <span class="function"><a href="function.enchant-dict-add.php" class="function">enchant_dict_add()</a></span> を代わりに使って下さい。
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.enchant-dict-is-in-session.php" class="function">enchant_dict_is_in_session()</a></span> は推奨されません。
     <span class="function"><a href="function.enchant-dict-is-added.php" class="function">enchant_dict_is_added()</a></span> を代わりに使って下さい。
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.enchant-broker-free.php" class="function">enchant_broker_free()</a></span> と
     <span class="function"><a href="function.enchant-broker-free-dict.php" class="function">enchant_broker_free_dict()</a></span> は推奨されません。
     代わりにオブジェクトを unset して下さい。
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     定数 <strong><code><a href="enchant.constants.php#constant.enchant-myspell">ENCHANT_MYSPELL</a></code></strong> と
     <strong><code><a href="enchant.constants.php#constant.enchant-ispell">ENCHANT_ISPELL</a></code></strong> は推奨されません。
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.deprecated.libxml">
  <h3 class="title">LibXML</h3>

  <p class="para">
   <span class="function"><a href="function.libxml-disable-entity-loader.php" class="function">libxml_disable_entity_loader()</a></span> 関数は推奨されなくなりました。
   libxml 2.9.0 がビルドに必須になったので、
   外部エンティティの読み込みはデフォルトで無効になっていることが保証されています。
   よって、(未だ脆弱な) <strong><code><a href="libxml.constants.php#constant.libxml-noent">LIBXML_NOENT</a></code></strong> を使わない限り、
   XXE 攻撃を防ぐためにこの関数を使う必要は既になくなっています。
   <strong><code><a href="libxml.constants.php#constant.libxml-noent">LIBXML_NOENT</a></code></strong> をまだ使っている場合は、
   外部エンティティの読み込みを抑制するように、
   <span class="function"><a href="function.libxml-set-external-entity-loader.php" class="function">libxml_set_external_entity_loader()</a></span>
   を使ってコードをリファクタリングすることを推奨します。
  </p>
 </div>

 <div class="sect2" id="migration80.deprecated.pgsql">
  <h3 class="title">PGSQL / PDO PGSQL</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     定数 <strong><code><a href="pgsql.constants.php#constant.pgsql-libpq-version-str">PGSQL_LIBPQ_VERSION_STR</a></code></strong> の値は、
     <strong><code><a href="pgsql.constants.php#constant.pgsql-libpq-version">PGSQL_LIBPQ_VERSION</a></code></strong> と同じになりました。
     よって、<strong><code><a href="pgsql.constants.php#constant.pgsql-libpq-version-str">PGSQL_LIBPQ_VERSION_STR</a></code></strong> は推奨されません。
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     pgsql 拡張モジュールの関数エイリアスは推奨されなくなりました。
     代わりにどの関数を使うべきなのかは、以下の一覧を参照ください:
    </p>
    <p class="para">
     <ul class="simplelist">
      <li><span class="function"><strong>pg_errormessage()</strong></span> → <span class="function"><a href="function.pg-last-error.php" class="function">pg_last_error()</a></span></li>
      <li><span class="function"><strong>pg_numrows()</strong></span> → <span class="function"><a href="function.pg-num-rows.php" class="function">pg_num_rows()</a></span></li>
      <li><span class="function"><strong>pg_numfields()</strong></span> → <span class="function"><a href="function.pg-num-fields.php" class="function">pg_num_fields()</a></span></li>
      <li><span class="function"><strong>pg_cmdtuples()</strong></span> → <span class="function"><a href="function.pg-affected-rows.php" class="function">pg_affected_rows()</a></span></li>
      <li><span class="function"><strong>pg_fieldname()</strong></span> → <span class="function"><a href="function.pg-field-name.php" class="function">pg_field_name()</a></span></li>
      <li><span class="function"><strong>pg_fieldsize()</strong></span> → <span class="function"><a href="function.pg-field-size.php" class="function">pg_field_size()</a></span></li>
      <li><span class="function"><strong>pg_fieldtype()</strong></span> → <span class="function"><a href="function.pg-field-type.php" class="function">pg_field_type()</a></span></li>
      <li><span class="function"><strong>pg_fieldnum()</strong></span> → <span class="function"><a href="function.pg-field-num.php" class="function">pg_field_num()</a></span></li>
      <li><span class="function"><strong>pg_result()</strong></span> → <span class="function"><a href="function.pg-fetch-result.php" class="function">pg_fetch_result()</a></span></li>
      <li><span class="function"><strong>pg_fieldprtlen()</strong></span> → <span class="function"><a href="function.pg-field-prtlen.php" class="function">pg_field_prtlen()</a></span></li>
      <li><span class="function"><strong>pg_fieldisnull()</strong></span> → <span class="function"><a href="function.pg-field-is-null.php" class="function">pg_field_is_null()</a></span></li>
      <li><span class="function"><strong>pg_freeresult()</strong></span> → <span class="function"><a href="function.pg-free-result.php" class="function">pg_free_result()</a></span></li>
      <li><span class="function"><strong>pg_getlastoid()</strong></span> → <span class="function"><a href="function.pg-last-oid.php" class="function">pg_last_oid()</a></span></li>
      <li><span class="function"><strong>pg_locreate()</strong></span> → <span class="function"><a href="function.pg-lo-create.php" class="function">pg_lo_create()</a></span></li>
      <li><span class="function"><strong>pg_lounlink()</strong></span> → <span class="function"><a href="function.pg-lo-unlink.php" class="function">pg_lo_unlink()</a></span></li>
      <li><span class="function"><strong>pg_loopen()</strong></span> → <span class="function"><a href="function.pg-lo-open.php" class="function">pg_lo_open()</a></span></li>
      <li><span class="function"><strong>pg_loclose()</strong></span> → <span class="function"><a href="function.pg-lo-close.php" class="function">pg_lo_close()</a></span></li>
      <li><span class="function"><strong>pg_loread()</strong></span> → <span class="function"><a href="function.pg-lo-read.php" class="function">pg_lo_read()</a></span></li>
      <li><span class="function"><strong>pg_lowrite()</strong></span> → <span class="function"><a href="function.pg-lo-write.php" class="function">pg_lo_write()</a></span></li>
      <li><span class="function"><strong>pg_loreadall()</strong></span> → <span class="function"><a href="function.pg-lo-read-all.php" class="function">pg_lo_read_all()</a></span></li>
      <li><span class="function"><strong>pg_loimport()</strong></span> → <span class="function"><a href="function.pg-lo-import.php" class="function">pg_lo_import()</a></span></li>
      <li><span class="function"><strong>pg_loexport()</strong></span> → <span class="function"><a href="function.pg-lo-export.php" class="function">pg_lo_export()</a></span></li>
      <li><span class="function"><strong>pg_setclientencoding()</strong></span> → <span class="function"><a href="function.pg-set-client-encoding.php" class="function">pg_set_client_encoding()</a></span></li>
      <li><span class="function"><strong>pg_clientencoding()</strong></span> -> <span class="function"><a href="function.pg-client-encoding.php" class="function">pg_client_encoding()</a></span></li>
     </ul>
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.deprecated.standard">
  <h3 class="title">標準ライブラリ</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     <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> を返すソートの比較関数は、推奨されない警告を発生させるようになりました。
     0より大きいか、0に等しいか、0より小さい整数を返す実装に置き換えるべきです。
    </p>
    <p class="para">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// この実装を<br /></span><span style="color: #0000BB">usort</span><span style="color: #007700">(</span><span style="color: #0000BB">$array</span><span style="color: #007700">, fn(</span><span style="color: #0000BB">$a</span><span style="color: #007700">, </span><span style="color: #0000BB">$b</span><span style="color: #007700">) =&gt; </span><span style="color: #0000BB">$a </span><span style="color: #007700">&gt; </span><span style="color: #0000BB">$b</span><span style="color: #007700">);<br /></span><span style="color: #FF8000">// 以下のように置き換えて下さい<br /></span><span style="color: #0000BB">usort</span><span style="color: #007700">(</span><span style="color: #0000BB">$array</span><span style="color: #007700">, fn(</span><span style="color: #0000BB">$a</span><span style="color: #007700">, </span><span style="color: #0000BB">$b</span><span style="color: #007700">) =&gt; </span><span style="color: #0000BB">$a </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #0000BB">$b</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>
 
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.deprecated.zip">
  <h3 class="title">Zip</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     空のファイルを ZipArchive として使うことは推奨されなくなりました。
     Libzip 1.6.0 は空のファイルを正しいzipアーカイブとして受け入れなくなっています。
     既に存在する回避策は、次のバージョンで削除される予定です。
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Zip の手続き型の API は推奨されなくなりました。
     <span class="classname"><a href="class.ziparchive.php" class="classname">ZipArchive</a></span> クラスを代わりに使って下さい。
     <span class="methodname"><a href="ziparchive.statindex.php" class="methodname">ZipArchive::statIndex()</a></span> と
     <a href="control-structures.for.php" class="link">for</a> ループを以下のようにして使えば、
     全てのエントリを処理できます:
    </p>
    <p class="para">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// 手続き型のAPIを使ってループする<br /></span><span style="color: #0000BB">assert</span><span style="color: #007700">(</span><span style="color: #0000BB">is_resource</span><span style="color: #007700">(</span><span style="color: #0000BB">$zip</span><span style="color: #007700">));<br />while (</span><span style="color: #0000BB">$entry </span><span style="color: #007700">= </span><span style="color: #0000BB">zip_read</span><span style="color: #007700">(</span><span style="color: #0000BB">$zip</span><span style="color: #007700">)) {<br />    echo </span><span style="color: #0000BB">zip_entry_name</span><span style="color: #007700">(</span><span style="color: #0000BB">$entry</span><span style="color: #007700">);<br />}<br /><br /></span><span style="color: #FF8000">// オブジェクト指向のAPIを使ってループする<br /></span><span style="color: #0000BB">assert</span><span style="color: #007700">(</span><span style="color: #0000BB">$zip </span><span style="color: #007700">instanceof </span><span style="color: #0000BB">ZipArchive</span><span style="color: #007700">);<br />for (</span><span style="color: #0000BB">$i </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">; </span><span style="color: #0000BB">$entry </span><span style="color: #007700">= </span><span style="color: #0000BB">$zip</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">statIndex</span><span style="color: #007700">(</span><span style="color: #0000BB">$i</span><span style="color: #007700">); </span><span style="color: #0000BB">$i</span><span style="color: #007700">++) {<br />    echo </span><span style="color: #0000BB">$entry</span><span style="color: #007700">[</span><span style="color: #DD0000">'name'</span><span style="color: #007700">];<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </p>
   </li>
  </ul>
 </div>

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

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     <span class="methodname"><a href="reflectionfunction.isdisabled.php" class="methodname">ReflectionFunction::isDisabled()</a></span> は推奨されなくなりました。
     無効な関数に対して <span class="classname"><a href="class.reflectionfunction.php" class="classname">ReflectionFunction</a></span>
     を生成することはできなくなっているためです。
     このメソッドは常に <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> を返すようになっています。
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="methodname"><a href="reflectionparameter.getclass.php" class="methodname">ReflectionParameter::getClass()</a></span>,
     <span class="methodname"><a href="reflectionparameter.isarray.php" class="methodname">ReflectionParameter::isArray()</a></span>,
     <span class="methodname"><a href="reflectionparameter.iscallable.php" class="methodname">ReflectionParameter::isCallable()</a></span> は推奨されません。
     <span class="methodname"><a href="reflectionparameter.gettype.php" class="methodname">ReflectionParameter::getType()</a></span> と
     <span class="classname"><a href="class.reflectiontype.php" class="classname">ReflectionType</a></span> API を代わりに使って下さい。
    </p>
   </li>
  </ul>
 </div>

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