<?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 => 'ru',
  ),
  'this' => 
  array (
    0 => 'migration80.deprecated.php',
    1 => 'Функциональность, объявленная устаревшей в PHP 8.0.x',
    2 => 'Функциональность, объявленная устаревшей в PHP 8.0.x',
  ),
  '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' => 'ru',
    '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">Функциональность, объявленная устаревшей в PHP 8.0.x</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:
    </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">
     Вызов <span class="function"><a href="function.get-defined-functions.php" class="function">get_defined_functions()</a></span> с явно заданным значением <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>
     в <code class="parameter">exclude_disabled</code> устарел и больше не имеет смысла.
     <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,
   в котором загрузка внешних объектов по умолчанию отключена, поэтому использование этой функции
   больше не требуется для защиты от 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> и поэтому объявлена устаревшей.
    </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> теперь сгенерирует предупреждение об устаревшей возможности,
     поэтому их следует переписать, чтобы они возвращали целое число меньше, равное или
     больше нуля.
    </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">
     Процедурный API Zip объявлен устаревшим. Вместо него используйте <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">Reflection</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> и
     API <span class="classname"><a href="class.reflectiontype.php" class="classname">ReflectionType</a></span>.
    </p>
   </li>
  </ul>
 </div>

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