<?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.incompatible.php',
    1 => 'Изменения, которые ломают обратную совместимость',
    2 => 'Изменения, которые ломают обратную совместимость',
  ),
  'up' => 
  array (
    0 => 'migration80.php',
    1 => 'Миграция с PHP 7.4.x на PHP 8.0.x',
  ),
  'prev' => 
  array (
    0 => 'migration80.new-classes.php',
    1 => 'Новые классы и интерфейсы',
  ),
  'next' => 
  array (
    0 => 'migration80.deprecated.php',
    1 => 'Функциональность, объявленная устаревшей в PHP 8.0.x',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'appendices/migration80/incompatible.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="migration80.incompatible" class="sect1">
 <h2 class="title">Изменения, которые ломают обратную совместимость</h2>

 <div class="sect2" id="migration80.incompatible.core">
  <h3 class="title">Ядро PHP</h3>

  <div class="sect3" id="migration80.incompatible.core.string-number-comparision">
   <h4 class="title">Сравнение строк с числами</h4>

   <p class="para">
    Нестрогие сравнения чисел и нечисловых строк теперь работают как преобразование числа
    в строку с последующим сравнением строк. Сравнение чисел и числовых строк работает
    по прежним правилам. Поэтому сравнение наподобие <code class="code">0 == &quot;not-a-number&quot;</code> теперь
    выдаст false.
    <table class="doctable informaltable">
     
      <thead>
       <tr>
        <th>Сравнение</th>
        <th>До</th>
        <th>После</th>
       </tr>

      </thead>

      <tbody class="tbody">
       <tr>
        <td><code class="code">0 == &quot;0&quot;</code></td>
        <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong></td>
        <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong></td>
       </tr>

       <tr>
        <td><code class="code">0 == &quot;0.0&quot;</code></td>
        <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong></td>
        <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong></td>
       </tr>

       <tr>
        <td><code class="code">0 == &quot;foo&quot;</code></td>
        <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong></td>
        <td><strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong></td>
       </tr>

       <tr>
        <td><code class="code">0 == &quot;&quot;</code></td>
        <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong></td>
        <td><strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong></td>
       </tr>

       <tr>
        <td><code class="code">42 == &quot;   42&quot;</code></td>
        <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong></td>
        <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong></td>
       </tr>

       <tr>
        <td><code class="code">42 == &quot;42foo&quot;</code></td>
        <td><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong></td>
        <td><strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong></td>
       </tr>

      </tbody>
     
    </table>

    
   </p>
  </div>

  <div class="sect3" id="migration80.incompatible.core.other">
   <h4 class="title">Другие изменения, которые ломают обратную совместимость</h4>

   <ul class="itemizedlist">
    <li class="listitem">
     <p class="para">
      Слово <code class="literal">match</code> стало зарезервированным ключевым словом.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Слово <code class="literal">mixed</code> стало зарезервированным, поэтому его нельзя указывать как название класса, интерфейса или трейта, и в пространствах имён.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Ошибки утверждений теперь выбрасываются по умолчанию. Старое поведение
      устанавливается в INI-настройке <code class="code">assert.exception=0</code>.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Методы с названием как у класса больше не интерпретируются как конструкторы.
      Вместо этого определяют метод <a href="language.oop5.decon.php#object.construct" class="link">__construct()</a>.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Нестатические методы теперь нельзя вызывать статически, поэтому
      функция <span class="function"><a href="function.is-callable.php" class="function">is_callable()</a></span> завершится ошибкой при проверке нестатического
      метода с названием класса, доступность вызова необходимо проверять с экземпляром объекта.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Приведения типов <code class="code">(real)</code> и <code class="code">(unset)</code> удалили.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      INI-директиву <a href="errorfunc.configuration.php#ini.track-errors" class="link">track_errors</a> удалили. Это означает,
      что <var class="varname">php_errormsg</var> больше не актуален. Вместо него пользуются функцией
      <span class="function"><a href="function.error-get-last.php" class="function">error_get_last()</a></span>.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Больше нельзя определять константы без учёта регистра. Больше нельзя устанавливать
      для третьего параметра функции <span class="function"><a href="function.define.php" class="function">define()</a></span> значение <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Больше нельзя указывать автозагрузчик через функцию <span class="function"><a href="function.autoload.php" class="function">__autoload()</a></span>.
      Вместо этого рекомендуют пользоваться функцией <span class="function"><a href="function.spl-autoload-register.php" class="function">spl_autoload_register()</a></span>.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Аргумент <code class="parameter">errcontext</code> больше не передаётся в пользовательские
      обработчики ошибок, которые задали функцией <span class="function"><a href="function.set-error-handler.php" class="function">set_error_handler()</a></span>.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Функцию <span class="function"><a href="function.create-function.php" class="function">create_function()</a></span> удалили. Вместо неё пользуются анонимными функцииями.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Функцию <span class="function"><a href="function.each.php" class="function">each()</a></span> удалили. Вместо неё пользуются конструкцией <a href="control-structures.foreach.php" class="link"><code class="literal">foreach</code></a>
      или классом <span class="classname"><a href="class.arrayiterator.php" class="classname">ArrayIterator</a></span>.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Больше нельзя отвязать переменную <var class="varname">this</var> от замыканий,
      которые создали из методов <span class="methodname"><a href="closure.fromcallable.php" class="methodname">Closure::fromCallable()</a></span>
      или <span class="methodname"><a href="reflectionmethod.getclosure.php" class="methodname">ReflectionMethod::getClosure()</a></span>.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Больше нельзя отвязать переменную <var class="varname">this</var> от правильных замыканий, которые содержат
      <var class="varname">this</var>.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Функцию <span class="function"><a href="function.array-key-exists.php" class="function">array_key_exists()</a></span> больше нельзя вызывать с объектами.
      Вместо этого можно использовать <span class="function"><a href="function.isset.php" class="function">isset()</a></span> или <span class="function"><a href="function.property-exists.php" class="function">property_exists()</a></span>.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Работа параметра <code class="parameter">key</code> в функции <span class="function"><a href="function.array-key-exists.php" class="function">array_key_exists()</a></span>
      теперь приведена в соответствии с <span class="function"><a href="function.isset.php" class="function">isset()</a></span> и
      обычным доступом к массиву. Все типы ключей теперь используют обычное приведение типов,
      массив/объект к ключе приведёт к выбрасыванию <span class="classname"><a href="class.typeerror.php" class="classname">TypeError</a></span>.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Любой массив, у которого в качестве первого числового ключа указано число <span class="replaceable">n</span>,
      будет использовать <span class="replaceable">n+1</span> для своего следующего неявного ключа, даже если <span class="replaceable">n</span>
      отрицательно.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Уровень error_reporting по умолчанию теперь <strong><code><a href="errorfunc.constants.php#constant.e-all">E_ALL</a></code></strong>. Ранее он исключал
      <strong><code><a href="errorfunc.constants.php#constant.e-notice">E_NOTICE</a></code></strong> и <strong><code><a href="errorfunc.constants.php#constant.e-deprecated">E_DEPRECATED</a></code></strong>.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      <a href="errorfunc.configuration.php#ini.display-startup-errors" class="link">display_startup_errors</a> теперь включён
      по умолчанию.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Использование <span class="type">parent</span> внутри класса, у которого нет родителя, теперь приведёт
      к фатальной ошибке во время компиляции.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Оператор <code class="literal">@</code> больше не подавляет фатальные ошибки
      (<strong><code><a href="errorfunc.constants.php#constant.e-error">E_ERROR</a></code></strong>, <strong><code><a href="errorfunc.constants.php#constant.e-core-error">E_CORE_ERROR</a></code></strong>,
      <strong><code><a href="errorfunc.constants.php#constant.e-compile-error">E_COMPILE_ERROR</a></code></strong>, <strong><code><a href="errorfunc.constants.php#constant.e-user-error">E_USER_ERROR</a></code></strong>,
      <strong><code><a href="errorfunc.constants.php#constant.e-recoverable-error">E_RECOVERABLE_ERROR</a></code></strong>, <strong><code><a href="errorfunc.constants.php#constant.e-parse">E_PARSE</a></code></strong>). Обработчики ошибок,
      которые ожидают, что error_reporting будет иметь значение <code class="literal">0</code> при использовании оператора <code class="literal">@</code>,
      должны делать такие проверки через битовую маску:
     </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: #007700">function </span><span style="color: #0000BB">my_error_handler</span><span style="color: #007700">(</span><span style="color: #0000BB">$err_no</span><span style="color: #007700">, </span><span style="color: #0000BB">$err_msg</span><span style="color: #007700">, </span><span style="color: #0000BB">$filename</span><span style="color: #007700">, </span><span style="color: #0000BB">$linenum</span><span style="color: #007700">) {<br />    if (</span><span style="color: #0000BB">error_reporting</span><span style="color: #007700">() == </span><span style="color: #0000BB">0</span><span style="color: #007700">) {<br />        return </span><span style="color: #0000BB">false</span><span style="color: #007700">;<br />    }<br />    </span><span style="color: #FF8000">// ...<br /></span><span style="color: #007700">}<br /><br /></span><span style="color: #FF8000">// На это<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">my_error_handler</span><span style="color: #007700">(</span><span style="color: #0000BB">$err_no</span><span style="color: #007700">, </span><span style="color: #0000BB">$err_msg</span><span style="color: #007700">, </span><span style="color: #0000BB">$filename</span><span style="color: #007700">, </span><span style="color: #0000BB">$linenum</span><span style="color: #007700">) {<br />    if (!(</span><span style="color: #0000BB">error_reporting</span><span style="color: #007700">() &amp; </span><span style="color: #0000BB">$err_no</span><span style="color: #007700">)) {<br />        return </span><span style="color: #0000BB">false</span><span style="color: #007700">;<br />    }<br />    </span><span style="color: #FF8000">// ...<br /></span><span style="color: #007700">}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </p>
     <p class="para">
      Кроме этого, обязательно следует скрыть отображение сообщений об ошибках в производственной среде,
      которые могут привести к утечке информации. Проверьте, что <code class="code">display_errors=Off</code>
      используется вместе с включённой записью журнала ошибок.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      <code class="literal">#[</code> больше не интерпретируется как начало комментария,
      так как этот синтаксис теперь используется для атрибутов.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Ошибки наследования из-за несовместимых сигнатур методов (нарушения LSP) теперь всегда
      вызывают фатальную ошибку. Ранее в некоторых случаях выдавалось предупреждение.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Приоритет оператора конкатенации изменился относительно сдвигов битов и сложения,
      а также вычитания.
     </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">echo </span><span style="color: #DD0000">"Сумма: " </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">;<br /></span><span style="color: #FF8000">// ранее интерпретировалось как:<br /></span><span style="color: #007700">echo (</span><span style="color: #DD0000">"Сумма: " </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">;<br /></span><span style="color: #FF8000">// сейчас интерпретируется как:<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"Сумма:" </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">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Аргументы со значением по умолчанию, которое разрешается в <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> во время выполнения, больше не будут неявно помечать
      тип аргумента как nullable. Вместо этого нужно указывать либо явный тип, разрешающий значение null,
      либо явное значение <strong><code><a href="reserved.constants.php#constant.null">null</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: #007700">function </span><span style="color: #0000BB">test</span><span style="color: #007700">(</span><span style="color: #0000BB">int $arg </span><span style="color: #007700">= </span><span style="color: #0000BB">CONST_RESOLVING_TO_NULL</span><span style="color: #007700">) {}<br /></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">int $arg </span><span style="color: #007700">= </span><span style="color: #0000BB">CONST_RESOLVING_TO_NULL</span><span style="color: #007700">) {}<br /></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">int $arg </span><span style="color: #007700">= </span><span style="color: #0000BB">null</span><span style="color: #007700">) {}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Ряд предупреждений преобразован в исключения <span class="classname"><a href="class.error.php" class="classname">Error</a></span>:
     </p>
     <p class="para">
      <ul class="simplelist">
       <li>
        Попытка записи в свойство несуществующего объекта. Ранее это
        неявно создавало объект stdClass в случае null, false и пустых строк.
       </li>
       <li>
        Попытка добавить элемент в массив, для которого
        уже используется ключ PHP_INT_MAX.
       </li>
       <li>
        Попытка использовать недопустимый тип (массив или объект) в качестве ключа массива или
        смещения строки.
       </li>
       <li>Попытка записать в индекс массива скалярное значение.</li>
       <li>Попытка распаковать значение, не являющее массивом/Traversable.</li>
       <li>
        Попытка получить доступ к неквалифицированным константам, которые не определены.
        Ранее неквалифицированный доступ к константам приводил к предупреждению и интерпретировался как строка.
       </li>
       <li>
        Передача неверного количества аргументов в невариативную встроенную функцию приведёт
        к исключению <span class="classname"><a href="class.argumentcounterror.php" class="classname">ArgumentCountError</a></span>.
       </li>
       <li>
        Передача недопустимых исчисляемых типов в функцию <span class="function"><a href="function.count.php" class="function">count()</a></span> выбросит исключение
        <span class="classname"><a href="class.typeerror.php" class="classname">TypeError</a></span>.
       </li>
      </ul>
     </p>
     <p class="para">
      Ряд уведомлений преобразован в предупреждения:
     </p>
     <p class="para">
      <ul class="simplelist">
       <li>Попытка прочитать неопределённую переменную.</li>
       <li>Попытка прочитать неопределённое свойство.</li>
       <li>Попытка прочитать неопределённый ключ массива.</li>
       <li>Попытка прочитать свойство не-объекта.</li>
       <li>Попытка получить доступ к индексу массива не-массива.</li>
       <li>Попытка преобразовать массив в строку.</li>
       <li>Попытка использовать ресурс в качестве ключа массива.</li>
       <li>Попытка использовать null, логическое значение или число с плавающей точкой в качестве строкового смещения.</li>
       <li>Попытка прочитать смещение строки за пределами допустимой границы.</li>
       <li>Попытка присвоить смещению строки пустую строку.</li>
      </ul>
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      При попытке назначить несколько байтов смещению строки теперь будет выдано предупреждение.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Неожиданные символы в исходных файлах (например, байты NUL за пределами строк) теперь будут приводить к исключению
      <span class="classname"><a href="class.parseerror.php" class="classname">ParseError</a></span> вместо предупреждения при компиляции.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Неперехваченные исключения теперь проходят процедуру &quot;чистого завершения&quot;, это означает, что после неперехваченного исключения
      будут вызываться деструкторы.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Фатальная ошибка времени компиляции &quot;Only variables can be passed by reference&quot; была отложена
      до времени выполнения и преобразована в исключение <span class="classname"><a href="class.error.php" class="classname">Error</a></span>
      &quot;Argument cannot be passed by reference&quot;.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Некоторые уведомления &quot;Only variables can be passed by reference&quot; были преобразованы
      в исключение &quot;Argument cannot be passed by reference&quot;.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Сгенерированное имя для анонимных классов изменилось. Теперь он будет включать имя
      первого родителя или интерфейса:
     </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">new class extends </span><span style="color: #0000BB">ParentClass </span><span style="color: #007700">{};<br /></span><span style="color: #FF8000">// -&gt; ParentClass@anonymous<br /></span><span style="color: #007700">new class implements </span><span style="color: #0000BB">FirstInterface</span><span style="color: #007700">, </span><span style="color: #0000BB">SecondInterface </span><span style="color: #007700">{};<br /></span><span style="color: #FF8000">// -&gt; FirstInterface@anonymous<br /></span><span style="color: #007700">new class {};<br /></span><span style="color: #FF8000">// -&gt; class@anonymous<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </p>
     <p class="para">
      За новыми именами по-прежнему будет следовать NUL-байт и уникальный суффикс.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Ссылки на неабсолютные трейты методов в адаптациях псевдонимов трейтов теперь должны быть
      однозначными:
     </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">class </span><span style="color: #0000BB">X </span><span style="color: #007700">{<br />    use </span><span style="color: #0000BB">T1</span><span style="color: #007700">, </span><span style="color: #0000BB">T2 </span><span style="color: #007700">{<br />        </span><span style="color: #0000BB">func </span><span style="color: #007700">as </span><span style="color: #0000BB">otherFunc</span><span style="color: #007700">;<br />    }<br />    function </span><span style="color: #0000BB">func</span><span style="color: #007700">() {}<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </p>
     <p class="para">
      Если существуют и <code class="code">T1::func()</code>, и <code class="code">T2::func()</code>, этот код ранее
      принимался без уведомления, и предполагалось, что func ссылается на <code class="code">T1::func</code>. Теперь вместо этого будет
      выброшена фатальная ошибка: необходимо явно указать <code class="code">T1::func</code> или <code class="code">T2::func</code>.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Сигнатура абстрактных методов, определённых в трейтах, теперь проверяется по методу
      реализующего класса:
     </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">trait </span><span style="color: #0000BB">MyTrait </span><span style="color: #007700">{<br />    abstract private function </span><span style="color: #0000BB">neededByTrait</span><span style="color: #007700">(): </span><span style="color: #0000BB">string</span><span style="color: #007700">;<br />}<br /><br />class </span><span style="color: #0000BB">MyClass </span><span style="color: #007700">{<br />    use </span><span style="color: #0000BB">MyTrait</span><span style="color: #007700">;<br /><br />    </span><span style="color: #FF8000">// Ошибка из-за несоответствия типа возвращаемого значения.<br />    </span><span style="color: #007700">private function </span><span style="color: #0000BB">neededByTrait</span><span style="color: #007700">(): </span><span style="color: #0000BB">int </span><span style="color: #007700">{ return </span><span style="color: #0000BB">42</span><span style="color: #007700">; }<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Отключённые функции теперь обрабатываются точно так же, как несуществующие функции. Вызов отключённой
      функции сообщит, что нет такой функции, это даёт возможность переопределить отключённую функцию.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Оболочки потока <code class="literal">data://</code> больше не доступны для записи, что соответствует документированному
      поведению.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Арифметические и побитовые операторы <code class="literal">+</code>, <code class="literal">-</code>,
      <code class="literal">*</code>, <code class="literal">/</code>, <code class="literal">**</code>, <code class="literal">%</code>,
      <code class="literal">&lt;&lt;</code>, <code class="literal">&gt;&gt;</code>, <code class="literal">&amp;</code>,
      <code class="literal">|</code>, <code class="literal">^</code>, <code class="literal">~</code>, <code class="literal">++</code>,
      <code class="literal">--</code> теперь будут последовательно выдавать <span class="classname"><a href="class.typeerror.php" class="classname">TypeError</a></span>, когда одним
      из операндов является массив (<span class="type"><a href="language.types.array.php" class="type array">array</a></span>), ресурс (<span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>) или не перегруженный объект (<span class="type"><a href="language.types.object.php" class="type object">object</a></span>). Единственным исключением
      из этого правила является операция слияния массивов <code class="literal">+</code>, которая по-прежнему поддерживается.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Приведение с плавающей точкой в строку теперь всегда будет вести себя независимо от локали.
     </p>
     <p class="para">
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />setlocale</span><span style="color: #007700">(</span><span style="color: #0000BB">LC_ALL</span><span style="color: #007700">, </span><span style="color: #DD0000">"de_DE"</span><span style="color: #007700">);<br /></span><span style="color: #FF8000">// Ранее:  3,14<br />// Теперь: 3.14<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </p>
     <p class="para">
      Смотрите <span class="function"><a href="function.printf.php" class="function">printf()</a></span>, <span class="function"><a href="function.number-format.php" class="function">number_format()</a></span> и
      <span class="methodname"><strong>NumberFormatter()</strong></span> для получения информации о способах настройки форматирования чисел.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Удалена поддержка устаревших фигурных скобок для доступа к смещению.
     </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">$array</span><span style="color: #007700">{</span><span style="color: #0000BB">0</span><span style="color: #007700">};<br /></span><span style="color: #0000BB">$array</span><span style="color: #007700">{</span><span style="color: #DD0000">"key"</span><span style="color: #007700">};<br /></span><span style="color: #FF8000">// Используйте:<br /></span><span style="color: #0000BB">$array</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">$array</span><span style="color: #007700">[</span><span style="color: #DD0000">"key"</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Применение модификатора final к закрытому методу теперь приведёт к предупреждению, если этот метод
      не является конструктором.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Если в конструкторе объекта используется <span class="function"><a href="function.exit.php" class="function">exit()</a></span>, то деструктор объекта больше
      не будет вызываться. Это соответствует поведению, когда конструктор выбрасывает исключение.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Именам в пространстве имён больше нельзя содержать пробелы: имя <code class="code">Foo\Bar</code> будет распознаваться
      как имя в пространстве имён, <code class="code">Foo \ Bar</code> — нет. И наоборот, зарезервированные ключевые слова теперь
      разрешены в качестве сегментов пространства имён, что также может изменить интерпретацию кода:
      <code class="code">new\x</code> теперь совпадает с <code class="code">constant(&#039;new\x&#039;)</code>,
      но не с <code class="code">new \x()</code>.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Для вложенных тернарных операторов теперь требуется явное указание скобок.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      <span class="function"><a href="function.debug-backtrace.php" class="function">debug_backtrace()</a></span> и <span class="methodname"><a href="exception.gettrace.php" class="methodname">Exception::getTrace()</a></span> больше не будут
      предоставлять ссылки на аргументы. Невозможно изменить аргументы функции
      через трассировку.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Обработка числовых строк была изменена, чтобы сделать её более понятной и менее подверженной ошибкам.
      Завершающие пробелы теперь разрешены в числовых строках для согласованности с тем, как обрабатываются начальные
      пробелы. В основном это влияет на:
     </p>
     <p class="para">
      <ul class="simplelist">
       <li>Функцию <span class="function"><a href="function.is-numeric.php" class="function">is_numeric()</a></span></li>
       <li>Сравнение строк со строками</li>
       <li>Объявления типов</li>
       <li>Операции увеличения и уменьшения</li>
      </ul>
     </p>
     <p class="para">
      Понятие &quot;ведущая числовая строка&quot; в основном было отброшено; случаи, когда это осталось, существуют
      для облегчения миграции. Строки, которые выдавали <strong><code><a href="errorfunc.constants.php#constant.e-notice">E_NOTICE</a></code></strong> &quot;A non well-formed numeric value encountered&quot;,
      теперь будут выдавать <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong> &quot;A non-numeric value encountered&quot;,
      а все строки, которые выдавали <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong> &quot;A non-numeric value encountered&quot;
      теперь будет выдавать <span class="classname"><a href="class.typeerror.php" class="classname">TypeError</a></span>. В основном это влияет на:
     </p>
     <p class="para">
      <ul class="simplelist">
       <li>Арифметические операции</li>
       <li>Побитовые операции</li>
      </ul>
     </p>
     <p class="para">
      Это изменение <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong> на <span class="classname"><a href="class.typeerror.php" class="classname">TypeError</a></span> также влияет на
      <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong> &quot;Illegal string offset &#039;string&#039;&quot; для недопустимых смещений строки.
      Поведение явных приведений к int/float из строк не изменилось.
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Теперь у магических методов будут проверяться аргументы и возвращаемые типы, если они объявлены.
      Сигнатура должна соответствовать следующему списку:
     </p>
     <p class="para">
      <ul class="simplelist">
       <li><code class="code">__call(string $name, array $arguments): mixed</code></li>
       <li><code class="code">__callStatic(string $name, array $arguments): mixed</code></li>
       <li><code class="code">__clone(): void</code></li>
       <li><code class="code">__debugInfo(): ?array</code></li>
       <li><code class="code">__get(string $name): mixed</code></li>
       <li><code class="code">__invoke(mixed $arguments): mixed</code></li>
       <li><code class="code">__isset(string $name): bool</code></li>
       <li><code class="code">__serialize(): array</code></li>
       <li><code class="code">__set(string $name, mixed $value): void</code></li>
       <li><code class="code">__set_state(array $properties): object</code></li>
       <li><code class="code">__sleep(): array</code></li>
       <li><code class="code">__unserialize(array $data): void</code></li>
       <li><code class="code">__unset(string $name): void</code></li>
       <li><code class="code">__wakeup(): void</code></li>
      </ul>
      
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Ключи массива <span class="function"><a href="function.call-user-func-array.php" class="function">call_user_func_array()</a></span> теперь будут интерпретироваться как имена параметров,
      а не игнорироваться.
     </p>
    </li>
    <li class="listitem">
     <p class="para">
      Объявление функции с именем <code class="literal">assert()</code> внутри пространства имён больше
      не допускается и вызывает <strong><code><a href="errorfunc.constants.php#constant.e-compile-error">E_COMPILE_ERROR</a></code></strong>.
      Функция <span class="function"><a href="function.assert.php" class="function">assert()</a></span> подвергается специальной обработке со стороны движка,
      что может привести к несогласованному поведению при определении одноимённой функции в пространстве имён.
     </p>
    </li>
   </ul>
  </div>
 </div>

 <div class="sect2" id="migration80.incompatible.resource2object">
  <h3 class="title">Преобразование ресурсов в объекты</h3>

  <p class="para">
   Несколько ресурсов (<span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>) были преобразованы в объекты (<span class="type"><a href="language.types.object.php" class="type object">object</a></span>).
   Проверки возвращаемого значения с использованием <span class="function"><a href="function.is-resource.php" class="function">is_resource()</a></span> следует заменить проверками на <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>.
  </p>
  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.curl-init.php" class="function">curl_init()</a></span> теперь возвращает объект <span class="classname"><a href="class.curlhandle.php" class="classname">CurlHandle</a></span>
     вместо ресурса (<span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>). Функция <span class="function"><a href="function.curl-close.php" class="function">curl_close()</a></span> больше не имеет смысла,
     вместо этого экземпляр <span class="classname"><a href="class.curlhandle.php" class="classname">CurlHandle</a></span> автоматически уничтожается, если на него
     больше нет ссылки.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.curl-multi-init.php" class="function">curl_multi_init()</a></span> теперь возвращает объект <span class="classname"><a href="class.curlmultihandle.php" class="classname">CurlMultiHandle</a></span>
     вместо ресурса (<span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>). Функция <span class="function"><a href="function.curl-multi-close.php" class="function">curl_multi_close()</a></span> больше не имеет смысла,
     вместо этого экземпляр <span class="classname"><a href="class.curlmultihandle.php" class="classname">CurlMultiHandle</a></span> автоматически уничтожается, если на него
     больше нет ссылки.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.curl-share-init.php" class="function">curl_share_init()</a></span> теперь возвращает объект <span class="classname"><a href="class.curlsharehandle.php" class="classname">CurlShareHandle</a></span>
     вместо ресурса (<span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>). Функция <span class="function"><a href="function.curl-share-close.php" class="function">curl_share_close()</a></span> больше не имеет смысла,
     вместо этого экземпляр <span class="classname"><a href="class.curlsharehandle.php" class="classname">CurlShareHandle</a></span> автоматически уничтожается, если на него
     больше нет ссылки.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.enchant-broker-init.php" class="function">enchant_broker_init()</a></span> теперь возвращает объект <span class="classname"><a href="class.enchantbroker.php" class="classname">EnchantBroker</a></span>
     вместо ресурса (<span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>).
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.enchant-broker-request-dict.php" class="function">enchant_broker_request_dict()</a></span> и
     <span class="function"><a href="function.enchant-broker-request-pwl-dict.php" class="function">enchant_broker_request_pwl_dict()</a></span> теперь возвращают
     <span class="classname"><a href="class.enchantdictionary.php" class="classname">EnchantDictionary</a></span> объект вместо ресурса (<span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>).
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Модуль GD теперь использует объекты <span class="classname"><a href="class.gdimage.php" class="classname">GdImage</a></span> в качестве базовой структуры данных
     для изображений, а не ресурсы (<span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>).
     Функция <span class="function"><a href="function.imagedestroy.php" class="function">imagedestroy()</a></span> больше не имеет смысла; вместо этого экземпляр
     <span class="classname"><a href="class.gdimage.php" class="classname">GdImage</a></span> автоматически уничтожается, если на него больше нет ссылки.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.openssl-x509-read.php" class="function">openssl_x509_read()</a></span> и <span class="function"><a href="function.openssl-csr-sign.php" class="function">openssl_csr_sign()</a></span> теперь возвращают
     объект <span class="classname"><a href="class.opensslcertificate.php" class="classname">OpenSSLCertificate</a></span> вместо ресурса (<span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>).
     Функция <span class="function"><a href="function.openssl-x509-free.php" class="function">openssl_x509_free()</a></span> объявлена устаревшей и больше не имеет смысла, вместо этого экземпляр
     <span class="classname"><a href="class.opensslcertificate.php" class="classname">OpenSSLCertificate</a></span> автоматически уничтожается, если на него
     больше не ссылаются.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.openssl-csr-new.php" class="function">openssl_csr_new()</a></span> теперь возвращает объект
     <span class="classname"><a href="class.opensslcertificatesigningrequest.php" class="classname">OpenSSLCertificateSigningRequest</a></span> вместо ресурса (<span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>).
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.openssl-pkey-new.php" class="function">openssl_pkey_new()</a></span> теперь возвращает объект
     <span class="classname"><a href="class.opensslasymmetrickey.php" class="classname">OpenSSLAsymmetricKey</a></span> вместо ресурса (<span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>).
     Функция <span class="function"><a href="function.openssl-pkey-free.php" class="function">openssl_pkey_free()</a></span> объявлена устаревшей и больше не имеет смысла, вместо этого экземпляр
     <span class="classname"><a href="class.opensslasymmetrickey.php" class="classname">OpenSSLAsymmetricKey</a></span> автоматически уничтожается, если на него
     больше не ссылаются.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.shmop-open.php" class="function">shmop_open()</a></span> теперь возвращает объект <span class="classname"><a href="class.shmop.php" class="classname">Shmop</a></span> вместо
     ресурса (<span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>). Функция <span class="function"><a href="function.shmop-close.php" class="function">shmop_close()</a></span> больше не имеет смысла и объявлена устаревшей;
     вместо этого экземпляр <span class="classname"><a href="class.shmop.php" class="classname">Shmop</a></span> автоматически уничтожается, если на него
     больше не ссылаются.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.socket-create.php" class="function">socket_create()</a></span>, <span class="function"><a href="function.socket-create-listen.php" class="function">socket_create_listen()</a></span>,
     <span class="function"><a href="function.socket-accept.php" class="function">socket_accept()</a></span>, <span class="function"><a href="function.socket-import-stream.php" class="function">socket_import_stream()</a></span>,
     <span class="function"><a href="function.socket-addrinfo-connect.php" class="function">socket_addrinfo_connect()</a></span>, <span class="function"><a href="function.socket-addrinfo-bind.php" class="function">socket_addrinfo_bind()</a></span> и
     <span class="function"><a href="function.socket-wsaprotocol-info-import.php" class="function">socket_wsaprotocol_info_import()</a></span> теперь возвращают объект
     <span class="classname"><a href="class.socket.php" class="classname">Socket</a></span> вместо ресурса (<span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>).
     <span class="function"><a href="function.socket-addrinfo-lookup.php" class="function">socket_addrinfo_lookup()</a></span> теперь возвращает массив объектов
     <span class="classname"><a href="class.addressinfo.php" class="classname">AddressInfo</a></span> вместо массива ресурсов (<span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>).
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.msg-get-queue.php" class="function">msg_get_queue()</a></span> теперь возвращают объект <span class="classname"><a href="class.sysvmessagequeue.php" class="classname">SysvMessageQueue</a></span>
     вместо ресурса (<span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>).
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.sem-get.php" class="function">sem_get()</a></span> теперь возвращают объект <span class="classname"><a href="class.sysvsemaphore.php" class="classname">SysvSemaphore</a></span>
     вместо ресурса (<span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>).
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.shm-attach.php" class="function">shm_attach()</a></span> теперь возвращают объект <span class="classname"><a href="class.sysvsharedmemory.php" class="classname">SysvSharedMemory</a></span>
     вместо ресурса (<span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>).
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.xml-parser-create.php" class="function">xml_parser_create()</a></span> и <span class="function"><a href="function.xml-parser-create-ns.php" class="function">xml_parser_create_ns()</a></span> теперь возвращают
     объект <span class="classname"><a href="class.xmlparser.php" class="classname">XMLParser</a></span> вместо ресурса (<span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>).
     Функция <span class="function"><a href="function.xml-parser-free.php" class="function">xml_parser_free()</a></span> больше не имеет смысла, вместо этого экземпляр XMLParser
     автоматически уничтожается, если на него больше не ссылаются.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Функции <a href="book.xmlwriter.php" class="link">XMLWriter</a> теперь принимают и возвращают, соответственно,
     объекты <span class="classname"><a href="class.xmlwriter.php" class="classname">XMLWriter</a></span> вместо ресурсов (<span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>).
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.inflate-init.php" class="function">inflate_init()</a></span> теперь возвращает объект <span class="classname"><a href="class.inflatecontext.php" class="classname">InflateContext</a></span>
     вместо ресурса (<span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>).
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.deflate-init.php" class="function">deflate_init()</a></span> теперь возвращает объект <span class="classname"><a href="class.deflatecontext.php" class="classname">DeflateContext</a></span>
     вместо ресурса (<span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>).
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.com">
  <h3 class="title">COM и .Net (Windows)</h3>

  <p class="para">
   Возможность импорта констант без учёта регистра из библиотек типов была удалена.
   Второй аргумент <span class="function"><a href="function.com-load-typelib.php" class="function">com_load_typelib()</a></span> больше не может быть false;
   <a href="com.configuration.php#ini.com.autoregister-casesensitive" class="link">com.autoregister_casesensitive</a>
   больше нельзя отключить; Маркеры без учёта регистра в
   <a href="com.configuration.php#ini.com.typelib-file" class="link">com.typelib_file</a> игнорируются.
  </p>
 </div>

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

  <p class="para">
   <strong><code><a href="curl.constants.php#constant.curlopt-postfields">CURLOPT_POSTFIELDS</a></code></strong> больше не принимает объекты как массивы.
   Чтобы интерпретировать объект как массив, выполните явное приведение <code class="code">(array)</code>.
   То же самое относится и к другим параметрам, принимающим массивы.
  </p>
 </div>

 <div class="sect2" id="migration80.incompatible.datetime">
  <h3 class="title">Дата и время</h3>

  <p class="para">
   Для работы функций <span class="function"><a href="function.mktime.php" class="function">mktime()</a></span> и <span class="function"><a href="function.gmmktime.php" class="function">gmmktime()</a></span> теперь требуется
   хотя бы один аргумент. <span class="function"><a href="function.time.php" class="function">time()</a></span> может использоваться для получения текущей отметки времени.
  </p>
 </div>

 <div class="sect2" id="migration80.incompatible.dom">
  <h3 class="title">DOM</h3>

  <p class="para">
   Были удалены нереализованные классы из модуля DOM, которые не имели обработчика и содержали
   тестовые данные. Эти классы также были удалены в последней версии
   стандарта DOM:
  </p>
  <p class="para">
   <ul class="simplelist">
    <li><span class="classname"><strong class="classname">DOMNameList</strong></span></li>
    <li><span class="classname"><strong class="classname">DomImplementationList</strong></span></li>
    <li><span class="classname"><strong class="classname">DOMConfiguration</strong></span></li>
    <li><span class="classname"><strong class="classname">DomError</strong></span></li>
    <li><span class="classname"><strong class="classname">DomErrorHandler</strong></span></li>
    <li><span class="classname"><strong class="classname">DOMImplementationSource</strong></span></li>
    <li><span class="classname"><strong class="classname">DOMLocator</strong></span></li>
    <li><span class="classname"><strong class="classname">DOMUserDataHandler</strong></span></li>
    <li><span class="classname"><strong class="classname">DOMTypeInfo</strong></span></li>
    <li><span class="classname"><strong class="classname">DOMStringExtend</strong></span></li>
   </ul>
  </p>
  <p class="para">
   Удалены нереализованные методы модуля DOM, у которых не было реализации:
  </p>
  <p class="para">
   <ul class="simplelist">
    <li><span class="methodname"><strong>DOMNamedNodeMap::setNamedItem()</strong></span></li>
    <li><span class="methodname"><strong>DOMNamedNodeMap::removeNamedItem()</strong></span></li>
    <li><span class="methodname"><strong>DOMNamedNodeMap::setNamedItemNS()</strong></span></li>
    <li><span class="methodname"><strong>DOMNamedNodeMap::removeNamedItemNS()</strong></span></li>
    <li><span class="methodname"><strong>DOMText::replaceWholeText()</strong></span></li>
    <li><span class="methodname"><a href="domnode.comparedocumentposition.php" class="methodname">DOMNode::compareDocumentPosition()</a></span></li>
    <li><span class="methodname"><a href="domnode.isequalnode.php" class="methodname">DOMNode::isEqualNode()</a></span></li>
    <li><span class="methodname"><strong>DOMNode::getFeature()</strong></span></li>
    <li><span class="methodname"><strong>DOMNode::setUserData()</strong></span></li>
    <li><span class="methodname"><strong>DOMNode::getUserData()</strong></span></li>
    <li><span class="methodname"><strong>DOMDocument::renameNode()</strong></span></li>
   </ul>
  </p>
 </div>

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

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.enchant-broker-list-dicts.php" class="function">enchant_broker_list_dicts()</a></span>, <span class="function"><a href="function.enchant-broker-describe.php" class="function">enchant_broker_describe()</a></span> и
     <span class="function"><a href="function.enchant-dict-suggest.php" class="function">enchant_dict_suggest()</a></span> теперь возвращают пустой массив вместо <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.exif">
  <h3 class="title">Exif</h3>

  <p class="para">
   <span class="function"><a href="function.read-exif-data.php" class="function">read_exif_data()</a></span> была удалена; Вместо неё следует
   использовать <span class="function"><a href="function.exif-read-data.php" class="function">exif_read_data()</a></span>.
  </p>
 </div>

 <div class="sect2" id="migration80.incompatible.filter">
  <h3 class="title">Фильтрация данных</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Флаги <strong><code><a href="filter.constants.php#constant.filter-flag-scheme-required">FILTER_FLAG_SCHEME_REQUIRED</a></code></strong> и
     <strong><code><a href="filter.constants.php#constant.filter-flag-host-required">FILTER_FLAG_HOST_REQUIRED</a></code></strong> для фильтра
     <strong><code><a href="filter.constants.php#constant.filter-validate-url">FILTER_VALIDATE_URL</a></code></strong> были удалены. <code class="literal">scheme</code>
     и <code class="literal">host</code> необходимы (и всегда были).
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Типы <strong><code><a href="filter.constants.php#constant.input-request">INPUT_REQUEST</a></code></strong> и <strong><code><a href="filter.constants.php#constant.input-session">INPUT_SESSION</a></code></strong> для
     <span class="function"><a href="function.filter-input.php" class="function">filter_input()</a></span> и ей производных были удалены. Они никогда не были реализованы,
     а попытка их использования всегда приводила к вызову предупреждения.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.gd">
  <h3 class="title">GD</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Устаревшие функции <span class="function"><a href="function.image2wbmp.php" class="function">image2wbmp()</a></span> были удалены.
     
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Устаревшие функции <span class="function"><a href="function.png2wbmp.php" class="function">png2wbmp()</a></span> и <span class="function"><a href="function.jpeg2wbmp.php" class="function">jpeg2wbmp()</a></span>
     были удалены.
     
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Параметр <code class="parameter">mode</code> по умолчанию для функции <span class="function"><a href="function.imagecropauto.php" class="function">imagecropauto()</a></span> больше
     не принимает значение <code class="literal">-1</code>. Вместо этого следует использовать <strong><code><a href="image.constants.php#constant.img-crop-default">IMG_CROP_DEFAULT</a></code></strong>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     В Windows, <var class="filename">php_gd2.dll</var> переименован в <var class="filename">php_gd.dll</var>.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.gmp">
  <h3 class="title">GMP</h3>

  <p class="para">
   <span class="function"><a href="function.gmp-random.php" class="function">gmp_random()</a></span> была удалена. Вместо неё следует использовать
   <span class="function"><a href="function.gmp-random-range.php" class="function">gmp_random_range()</a></span> или
   <span class="function"><a href="function.gmp-random-bits.php" class="function">gmp_random_bits()</a></span>.
  </p>
 </div>

 <div class="sect2" id="migration80.incompatible.iconv">
  <h3 class="title">Iconv</h3>

  <p class="para">
   Реализации iconv, которые неправильно устанавливают <var class="varname">errno</var> в случае возникновения ошибок,
   больше не поддерживаются.
  </p>
 </div>

 <div class="sect2" id="migration80.incompatible.imap">
  <h3 class="title">IMAP</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Неиспользуемый аргумент <code class="parameter">default_host</code> функции
     <span class="function"><a href="function.imap-headerinfo.php" class="function">imap_headerinfo()</a></span> был удалён.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Функция <span class="function"><a href="function.imap-header.php" class="function">imap_header()</a></span>, которая является псевдонимом
     <span class="function"><a href="function.imap-headerinfo.php" class="function">imap_headerinfo()</a></span>, была удалена.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.intl">
  <h3 class="title">Функции интернационализации</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Устаревшая константа <strong><code><a href="intl.constants.php#constant.intl-idna-variant-2003">INTL_IDNA_VARIANT_2003</a></code></strong> удалена.
     
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Устаревшая константа <strong><code>Normalizer::NONE</code></strong> удалена.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.ldap">
  <h3 class="title">LDAP</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Устаревшие функции <span class="function"><a href="function.ldap-sort.php" class="function">ldap_sort()</a></span>,
     <span class="function"><a href="function.ldap-control-paged-result.php" class="function">ldap_control_paged_result()</a></span> и
     <span class="function"><a href="function.ldap-control-paged-result-response.php" class="function">ldap_control_paged_result_response()</a></span> удалены.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Изменился интерфейс <span class="function"><a href="function.ldap-set-rebind-proc.php" class="function">ldap_set_rebind_proc()</a></span>;
     параметр <code class="parameter">callback</code> больше не принимает пустые строки; вместо этого
     следует указывать <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.mbstring">
  <h3 class="title">MBString</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Директива <a href="mbstring.configuration.php#ini.mbstring.func-overload" class="link">mbstring.func_overload</a> была удалена.
     Связанные константы <strong><code><a href="mbstring.constants.php#constant.mb-overload-mail">MB_OVERLOAD_MAIL</a></code></strong>,
     <strong><code><a href="mbstring.constants.php#constant.mb-overload-string">MB_OVERLOAD_STRING</a></code></strong> и <strong><code><a href="mbstring.constants.php#constant.mb-overload-regex">MB_OVERLOAD_REGEX</a></code></strong>
     также были удалены. Наконец, записи <code class="literal">&quot;func_overload&quot;</code> и
     <code class="literal">&quot;func_overload_list&quot;</code> в <span class="function"><a href="function.mb-get-info.php" class="function">mb_get_info()</a></span> были удалены.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.mb-parse-str.php" class="function">mb_parse_str()</a></span> больше нельзя использовать без передачи массива результатов.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Удалён ряд устаревших псевдонимов mbregex. В следующем списке указано,
     какие функции следует использовать вместо них:
    </p>
    <p class="para">
     <ul class="simplelist">
      <li><span class="function"><strong>mbregex_encoding()</strong></span> → <span class="function"><a href="function.mb-regex-encoding.php" class="function">mb_regex_encoding()</a></span></li>
      <li><span class="function"><strong>mbereg()</strong></span> → <span class="function"><a href="function.mb-ereg.php" class="function">mb_ereg()</a></span></li>
      <li><span class="function"><strong>mberegi()</strong></span> → <span class="function"><a href="function.mb-eregi.php" class="function">mb_eregi()</a></span></li>
      <li><span class="function"><strong>mbereg_replace()</strong></span> → <span class="function"><a href="function.mb-ereg-replace.php" class="function">mb_ereg_replace()</a></span></li>
      <li><span class="function"><strong>mberegi_replace()</strong></span> → <span class="function"><a href="function.mb-eregi-replace.php" class="function">mb_eregi_replace()</a></span></li>
      <li><span class="function"><strong>mbsplit()</strong></span> → <span class="function"><a href="function.mb-split.php" class="function">mb_split()</a></span></li>
      <li><span class="function"><strong>mbereg_match()</strong></span> → <span class="function"><a href="function.mb-ereg-match.php" class="function">mb_ereg_match()</a></span></li>
      <li><span class="function"><strong>mbereg_search()</strong></span> → <span class="function"><a href="function.mb-ereg-search.php" class="function">mb_ereg_search()</a></span></li>
      <li><span class="function"><strong>mbereg_search_pos()</strong></span> → <span class="function"><a href="function.mb-ereg-search-pos.php" class="function">mb_ereg_search_pos()</a></span></li>
      <li><span class="function"><strong>mbereg_search_regs()</strong></span> → <span class="function"><a href="function.mb-ereg-search-regs.php" class="function">mb_ereg_search_regs()</a></span></li>
      <li><span class="function"><strong>mbereg_search_init()</strong></span> → <span class="function"><a href="function.mb-ereg-search-init.php" class="function">mb_ereg_search_init()</a></span></li>
      <li><span class="function"><strong>mbereg_search_getregs()</strong></span> → <span class="function"><a href="function.mb-ereg-search-getregs.php" class="function">mb_ereg_search_getregs()</a></span></li>
      <li><span class="function"><strong>mbereg_search_getpos()</strong></span> → <span class="function"><a href="function.mb-ereg-search-getpos.php" class="function">mb_ereg_search_getpos()</a></span></li>
      <li><span class="function"><strong>mbereg_search_setpos()</strong></span> → <span class="function"><a href="function.mb-ereg-search-setpos.php" class="function">mb_ereg_search_setpos()</a></span></li>
     </ul>
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Модификатор <code class="literal">e</code> для <span class="function"><a href="function.mb-ereg-replace.php" class="function">mb_ereg_replace()</a></span> был удалён.
     Вместо него следует использовать<span class="function"><a href="function.mb-ereg-replace-callback.php" class="function">mb_ereg_replace_callback()</a></span>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Аргумент нестрокового шаблона для <span class="function"><a href="function.mb-ereg-replace.php" class="function">mb_ereg_replace()</a></span> теперь будет интерпретироваться как
     строка вместо кодовой точки ASCII. Предыдущее поведение можно восстановить явным
     вызовом <span class="function"><a href="function.chr.php" class="function">chr()</a></span>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Аргумент <code class="parameter">needle</code> для функций <span class="function"><a href="function.mb-strpos.php" class="function">mb_strpos()</a></span>,
     <span class="function"><a href="function.mb-strrpos.php" class="function">mb_strrpos()</a></span>, <span class="function"><a href="function.mb-stripos.php" class="function">mb_stripos()</a></span>,
     <span class="function"><a href="function.mb-strripos.php" class="function">mb_strripos()</a></span>, <span class="function"><a href="function.mb-strstr.php" class="function">mb_strstr()</a></span>,
     <span class="function"><a href="function.mb-stristr.php" class="function">mb_stristr()</a></span>, <span class="function"><a href="function.mb-strrchr.php" class="function">mb_strrchr()</a></span> и
     <span class="function"><a href="function.mb-strrichr.php" class="function">mb_strrichr()</a></span> теперь может быть пустым.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Параметр <code class="parameter">is_hex</code>, который не использовался для внутренних целей, был удалён из
     <span class="function"><a href="function.mb-decode-numericentity.php" class="function">mb_decode_numericentity()</a></span>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Устаревшее поведение передачи кодировки в качестве третьего аргумента вместо смещения для функции
     <span class="function"><a href="function.mb-strrpos.php" class="function">mb_strrpos()</a></span> было удалено; вместо этого в качестве четвёртого аргумента
     следует указать явное смещение <code class="literal">0</code> с кодировкой.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Псевдонимы кодировки символов <code class="literal">ISO_8859-*</code> были заменены на псевдонимы
     <code class="literal">ISO8859-*</code> для лучшей совместимости с модулем iconv.
     Псевдонимы mbregex ISO 8859 с подчёркиванием (<code class="literal">ISO_8859_*</code> и
     <code class="literal">ISO8859_*</code>) также были удалены.
    </p>
   </li>
   <li class="listitem">
    <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> теперь будут возвращать
     логическое значение <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>, в случае найденного совпадения.
     Ранее они возвращали целое число <code class="literal">1</code>, если
     аргумент <code class="parameter">matches</code> не был передан, или <code class="code">max(1, strlen($matches[0]))</code>, если
     <code class="parameter">matches</code> был не пустой.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.oci8">
  <h3 class="title">OCI8</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Класс <span class="classname"><strong class="classname">OCI-Lob</strong></span> переименован в <span class="classname"><a href="class.ocilob.php" class="classname">OCILob</a></span>, а класс
     <span class="classname"><strong class="classname">OCI-Collection</strong></span> — в <span class="classname"><a href="class.ocicollection.php" class="classname">OCICollection</a></span> для имени
     совместимость обеспечивается средствами аннотации типа arginfo PHP 8.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Некоторые функции псевдонимов объявлены устаревшим.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.oci-internal-debug.php" class="function">oci_internal_debug()</a></span> и её псевдоним <span class="function"><a href="function.ociinternaldebug.php" class="function">ociinternaldebug()</a></span>
     были удалены.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.odbc">
  <h3 class="title">ODBC</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.odbc-connect.php" class="function">odbc_connect()</a></span> больше не использует соединения повторно.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Неиспользуемый параметр <code class="parameter">flags</code> функции <span class="function"><a href="function.odbc-exec.php" class="function">odbc_exec()</a></span>
     был удалён.
    </p>
   </li>
  </ul>
 </div>

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

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.openssl-seal.php" class="function">openssl_seal()</a></span> и <span class="function"><a href="function.openssl-open.php" class="function">openssl_open()</a></span> теперь требуют передачи
     <code class="parameter">method</code>, так как предыдущее значение по умолчанию <code class="literal">&quot;RC4&quot;</code>
     считается небезопасным.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.pcre">
  <h3 class="title">Регулярные выражения (совместимые с Perl)</h3>

  <p class="para">
   При передаче недопустимых управляющих последовательностей они больше не интерпретируются как литералы. Такое поведение
   ранее требовало модификатора <code class="literal">X</code>, который теперь игнорируется.
  </p>
 </div>

 <div class="sect2" id="migration80.incompatible.pdo">
  <h3 class="title">Объекты данных PHP</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Режим обработки ошибок по умолчанию был изменён с &quot;тихого&quot; (silent) на &quot;исключения&quot; (exceptions).
     Подробнее смотрите <a href="pdo.error-handling.php" class="link">Ошибки и обработка ошибок</a>.
     
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Изменились сигнатуры некоторых методов PDO:
    </p>
    <p class="para">
     <ul class="simplelist">
      <li><code class="code">PDO::query(string $query, ?int $fetchMode  = null, mixed  ...$fetchModeArgs)</code></li>
      <li><code class="code">PDOStatement::setFetchMode(int $mode, mixed ...$args)</code></li>
     </ul>
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.pdo-odbc">
  <h3 class="title">PDO ODBC</h3>

  <p class="para">
   Директива <var class="filename">php.ini</var>
   <a href="ref.pdo-odbc.php#ini.pdo-odbc.db2-instance-name" class="link">pdo_odbc.db2_instance_name</a>
   была удалена.
  </p>
 </div>

 <div class="sect2" id="migration80.incompatible.pdo-mysql">
  <h3 class="title">PDO MySQL</h3>

  <p class="para">
   <span class="methodname"><a href="pdo.intransaction.php" class="methodname">PDO::inTransaction()</a></span> теперь сообщает о фактическом состоянии транзакции
   подключения, а не о приблизительном от PDO. Если запрос,
   при условии &quot;неявной фиксации&quot;, выполняется, то <span class="methodname"><a href="pdo.intransaction.php" class="methodname">PDO::inTransaction()</a></span>
   впоследствии вернёт <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>, так как транзакция будет неактивной.
  </p>
 </div>

 <div class="sect2" id="migration80.incompatible.pgsql">
  <h3 class="title">PostgreSQL</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Устаревший синтаксис <span class="function"><a href="function.pg-connect.php" class="function">pg_connect()</a></span> с использованием нескольких параметров
     вместо строки подключения больше не поддерживается.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Устаревшие сигнатуры <span class="function"><a href="function.pg-lo-import.php" class="function">pg_lo_import()</a></span> и <span class="function"><a href="function.pg-lo-export.php" class="function">pg_lo_export()</a></span>,
     передающие соединение в качестве последнего аргумента, больше не поддерживаются. Вместо этого соединение должно
     быть передано первым аргументом.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.pg-fetch-all.php" class="function">pg_fetch_all()</a></span> теперь будет возвращать пустой массив вместо <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> для наборов
     результатов с отсутствующими строками.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.phar">
  <h3 class="title">Phar</h3>

  <p class="para">
   Метаданные, связанные с phar, больше не будут автоматически десериализоваться, чтобы исправить потенциальные
   уязвимости безопасности из-за создания экземпляров объекта, автозагрузки и т. д.
   
  </p>
 </div>

 <div class="sect2" id="migration80.incompatible.reflection">
  <h3 class="title">Reflection</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Сигнатуры методов
    </p>
    <p class="para">
     <ul class="simplelist">
      <li><code class="code">ReflectionClass::newInstance($args)</code></li>
      <li><code class="code">ReflectionFunction::invoke($args)</code></li>
      <li><code class="code">ReflectionMethod::invoke($object, $args)</code></li>
     </ul>
    </p>
    <p class="para">
     были изменены на:
    </p>
    <p class="para">
     <ul class="simplelist">
      <li><code class="code">ReflectionClass::newInstance(...$args)</code></li>
      <li><code class="code">ReflectionFunction::invoke(...$args)</code></li>
      <li><code class="code">ReflectionMethod::invoke($object, ...$args)</code></li>
     </ul>
    </p>
    <p class="para">
     Код, который должен быть совместим как с PHP 7, так и с PHP 8, может использовать следующие сигнатуры:
    </p>
    <p class="para">
     <ul class="simplelist">
      <li><code class="code">ReflectionClass::newInstance($arg = null, ...$args)</code></li>
      <li><code class="code">ReflectionFunction::invoke($arg = null, ...$args)</code></li>
      <li><code class="code">ReflectionMethod::invoke($object, $arg = null, ...$args)</code></li>
     </ul>
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Метод <span class="methodname"><a href="reflectiontype.tostring.php" class="methodname">ReflectionType::__toString()</a></span> теперь будет возвращать полное отладочное
     представление типа и больше не является устаревшим. В частности, результат будет включать
     индикатор допустимости значений NULL для типов, допускающих значение NULL. Формат возвращаемого значения
     нестабилен и может меняться в зависимости от версии PHP.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Методы Reflection export() были удалены.
     Вместо этого объекты reflection могут быть преобразованы в строку.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="methodname"><a href="reflectionmethod.isconstructor.php" class="methodname">ReflectionMethod::isConstructor()</a></span> и
     <span class="methodname"><a href="reflectionmethod.isdestructor.php" class="methodname">ReflectionMethod::isDestructor()</a></span> теперь также возвращают <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> для
     методов интерфейсов <a href="language.oop5.decon.php#object.construct" class="link">__construct()</a> и
     <a href="language.oop5.decon.php#object.destruct" class="link">__destruct()</a>.
     Раньше это было верно только для методов классов и трейтов.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Метод <span class="methodname"><strong>ReflectionType::isBuiltin()</strong></span> перемещён в
     <span class="classname"><a href="class.reflectionnamedtype.php" class="classname">ReflectionNamedType</a></span>. У <span class="classname"><a href="class.reflectionuniontype.php" class="classname">ReflectionUnionType</a></span>
     этого метода нет.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.sockets">
  <h3 class="title">Сокеты</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Устаревшие <code class="parameter">flags</code> <strong><code>AI_IDN_ALLOW_UNASSIGNED</code></strong> и
     <strong><code>AI_IDN_USE_STD3_ASCII_RULES</code></strong> для
     <span class="function"><a href="function.socket-addrinfo-lookup.php" class="function">socket_addrinfo_lookup()</a></span> были удалены.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.spl">
  <h3 class="title">Стандартная библиотека PHP (SPL)</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     <span class="methodname"><a href="splfileobject.fgetss.php" class="methodname">SplFileObject::fgetss()</a></span> был удалён.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="methodname"><a href="splfileobject.seek.php" class="methodname">SplFileObject::seek()</a></span> теперь всегда перемещается на начало
     строки.
     Ранее, позиция <code class="literal">&gt;=1</code> перемещала к началу следующие строки.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="methodname"><a href="splheap.compare.php" class="methodname">SplHeap::compare()</a></span> теперь указывает сигнатуру метода. Наследующие классы,
     реализующие этот метод, теперь должны будут использовать совместимую сигнатуру метода.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="methodname"><a href="spldoublylinkedlist.push.php" class="methodname">SplDoublyLinkedList::push()</a></span>,
     <span class="methodname"><a href="spldoublylinkedlist.unshift.php" class="methodname">SplDoublyLinkedList::unshift()</a></span> и
     <span class="methodname"><a href="splqueue.enqueue.php" class="methodname">SplQueue::enqueue()</a></span> теперь возвращают <span class="type"><span class="type"><a href="language.types.void.php" class="type void">void</a></span></span> вместо <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.spl-autoload-register.php" class="function">spl_autoload_register()</a></span> теперь всегда будет выбрасывать
     <span class="classname"><a href="class.typeerror.php" class="classname">TypeError</a></span> для недопустимых аргументов, поэтому второй аргумент
     <code class="parameter">do_throw</code> игнорируется, если для него установлено значение <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="classname"><a href="class.splfixedarray.php" class="classname">SplFixedArray</a></span> теперь является <span class="interfacename"><a href="class.iteratoraggregate.php" class="interfacename">IteratorAggregate</a></span>,
     а не <span class="interfacename"><a href="class.iterator.php" class="interfacename">Iterator</a></span>.
     <span class="methodname"><a href="splfixedarray.rewind.php" class="methodname">SplFixedArray::rewind()</a></span>, <span class="methodname"><a href="splfixedarray.current.php" class="methodname">SplFixedArray::current()</a></span>,
     <span class="methodname"><a href="splfixedarray.key.php" class="methodname">SplFixedArray::key()</a></span>, <span class="methodname"><a href="splfixedarray.next.php" class="methodname">SplFixedArray::next()</a></span> и
     <span class="methodname"><a href="splfixedarray.valid.php" class="methodname">SplFixedArray::valid()</a></span> были удалены. Вместо них был добавлен
     <span class="methodname"><a href="splfixedarray.getiterator.php" class="methodname">SplFixedArray::getIterator()</a></span>. Любой код, который использует явную
     итерацию над SplFixedArray, теперь должен получить
     <span class="interfacename"><a href="class.iterator.php" class="interfacename">Iterator</a></span> с помощью
     <span class="methodname"><a href="splfixedarray.getiterator.php" class="methodname">SplFixedArray::getIterator()</a></span>. Это означает, что
     <span class="classname"><a href="class.splfixedarray.php" class="classname">SplFixedArray</a></span> теперь безопасно использовать во вложенных циклах.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.standard">
  <h3 class="title">Библиотека стандартных функций</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.assert.php" class="function">assert()</a></span> больше не будет выполнять строковые аргументы, вместо этого они будут
     обрабатываться как любые обычные аргументы. Таким образом, вместо <code class="code">assert(&#039;$a == $b&#039;)</code> следует использовать
     <code class="code">assert($a == $b)</code>. INI-директива <a href="info.configuration.php#ini.assert.quiet-eval" class="link">assert.quiet_eval</a> и константа <strong><code><a href="info.constants.php#constant.assert-quiet-eval">ASSERT_QUIET_EVAL</a></code></strong>
     были удалены, так как они больше не имеют смысла.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.parse-str.php" class="function">parse_str()</a></span> больше нельзя использовать без указания массива результатов.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Фильтр <a href="filters.string.php#filters.string.strip_tags" class="link">string.strip_tags</a> удалён.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Аргумент <code class="parameter">needle</code> функций <span class="function"><a href="function.strpos.php" class="function">strpos()</a></span>,
     <span class="function"><a href="function.strrpos.php" class="function">strrpos()</a></span>, <span class="function"><a href="function.stripos.php" class="function">stripos()</a></span>, <span class="function"><a href="function.strripos.php" class="function">strripos()</a></span>,
     <span class="function"><a href="function.strstr.php" class="function">strstr()</a></span>, <span class="function"><a href="function.strchr.php" class="function">strchr()</a></span>, <span class="function"><a href="function.strrchr.php" class="function">strrchr()</a></span> и
     <span class="function"><a href="function.stristr.php" class="function">stristr()</a></span> теперь всегда будет интерпретироваться как строка. Раньше нестрочные needles
     интерпретировались как кодовая точка ASCII. Явный вызов <span class="function"><a href="function.chr.php" class="function">chr()</a></span> может
     использоваться для восстановления предыдущего поведения.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Аргумент <code class="parameter">needle</code> функций <span class="function"><a href="function.strpos.php" class="function">strpos()</a></span>,
     <span class="function"><a href="function.strrpos.php" class="function">strrpos()</a></span>, <span class="function"><a href="function.stripos.php" class="function">stripos()</a></span>, <span class="function"><a href="function.strripos.php" class="function">strripos()</a></span>,
     <span class="function"><a href="function.strstr.php" class="function">strstr()</a></span>, <span class="function"><a href="function.stristr.php" class="function">stristr()</a></span> и <span class="function"><a href="function.strrchr.php" class="function">strrchr()</a></span>
     теперь может быть пустым.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Аргумент <code class="parameter">length</code> функций <span class="function"><a href="function.substr.php" class="function">substr()</a></span>,
     <span class="function"><a href="function.substr-count.php" class="function">substr_count()</a></span>, <span class="function"><a href="function.substr-compare.php" class="function">substr_compare()</a></span> и
     <span class="function"><a href="function.iconv-substr.php" class="function">iconv_substr()</a></span> теперь может быть <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>. Значения <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> означает
     отсутствие аргумента длины, и поэтому функции вернут остаток строки
     вместо пустой строки.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Аргумент <code class="parameter">length</code> функции <span class="function"><a href="function.array-splice.php" class="function">array_splice()</a></span> теперь может быть
     <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>. Передача значения <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> означает отсутствие аргумента, поэтому функция удалить все, начиная
     от <code class="parameter">offset</code> до конца массива.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Аргумент <code class="parameter">args</code> функций <span class="function"><a href="function.vsprintf.php" class="function">vsprintf()</a></span>,
     <span class="function"><a href="function.vfprintf.php" class="function">vfprintf()</a></span> и <span class="function"><a href="function.vprintf.php" class="function">vprintf()</a></span> теперь должен быть массивом.
     Раньше принимался любой тип.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Параметр <code class="literal">&#039;salt&#039;</code> функции <span class="function"><a href="function.password-hash.php" class="function">password_hash()</a></span> больше не
     поддерживается. Если используется опция <code class="literal">&#039;salt&#039;</code>, генерируется предупреждение, переданная
     соль игнорируется, а вместо неё используется сгенерированная соль.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Функция <span class="function"><a href="function.quotemeta.php" class="function">quotemeta()</a></span> теперь будет возвращать пустую строку, если была
     передана пустая строка. Ранее возвращалось <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Удалены следующие функции:
    </p>
    <p class="para">
     <ul class="simplelist">
      <li><span class="function"><a href="function.hebrevc.php" class="function">hebrevc()</a></span></li>
      <li><span class="function"><a href="function.convert-cyr-string.php" class="function">convert_cyr_string()</a></span></li>
      <li><span class="function"><a href="function.money-format.php" class="function">money_format()</a></span></li>
      <li><span class="function"><a href="function.ezmlm-hash.php" class="function">ezmlm_hash()</a></span></li>
      <li><span class="function"><a href="function.restore-include-path.php" class="function">restore_include_path()</a></span></li>
      <li><span class="function"><a href="function.get-magic-quotes-gpc.php" class="function">get_magic_quotes_gpc()</a></span></li>
      <li><span class="function"><a href="function.get-magic-quotes-runtime.php" class="function">get_magic_quotes_runtime()</a></span></li>
      <li><span class="function"><a href="function.fgetss.php" class="function">fgetss()</a></span></li>
     </ul>
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <strong><code><a href="filter.constants.php#constant.filter-sanitize-magic-quotes">FILTER_SANITIZE_MAGIC_QUOTES</a></code></strong> удалена.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Вызов <span class="function"><a href="function.implode.php" class="function">implode()</a></span> с параметрами в обратном порядке <code class="code">($pieces,
     $glue)</code> больше не поддерживается.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.parse-url.php" class="function">parse_url()</a></span> теперь будет различать отсутствующие и пустые запросы и фрагменты:
    </p>
    <p class="para">
     <ul class="simplelist">
      <li><code class="code">http://example.com/foo → query = null, fragment = null</code></li>
      <li><code class="code">http://example.com/foo? → query = &quot;&quot;,   fragment = null</code></li>
      <li><code class="code">http://example.com/foo# → query = null, fragment = &quot;&quot;</code></li>
      <li><code class="code">http://example.com/foo?# → query = &quot;&quot;,   fragment = &quot;&quot;</code></li>
     </ul>
     Ранее во всех случаях query и fragment были <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.var-dump.php" class="function">var_dump()</a></span> и <span class="function"><a href="function.debug-zval-dump.php" class="function">debug_zval_dump()</a></span> теперь будут печатать
     числа с плавающей точкой, используя <a href="ini.core.php#ini.serialize-precision" class="link">serialize_precision</a>,
     а не <a href="ini.core.php#ini.precision" class="link">precision</a>. В конфигурации по умолчанию это означает,
     что числа с плавающей точкой теперь печатаются с полной точностью
     этими функциями отладки.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Если массив, возвращаемый <a href="language.oop5.magic.php#object.sleep" class="link">__sleep()</a>, содержит несуществующие
     свойства, теперь они автоматически проигнорируются. Ранее такие свойства были бы
     сериализованы, как если бы они имели значение <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Локаль по умолчанию при запуске теперь всегда будет определена как <code class="literal">&quot;C&quot;</code>. По умолчанию локали
     не наследуются из окружения. Ранее для <strong><code><a href="string.constants.php#constant.lc-all">LC_ALL</a></code></strong> было задано значение
     <code class="literal">&quot;C&quot;</code>, в то время как <strong><code><a href="string.constants.php#constant.lc-ctype">LC_CTYPE</a></code></strong> наследовался от окружения.
     Однако некоторые функции не учитывали унаследованную локаль без явного вызова <span class="function"><a href="function.setlocale.php" class="function">setlocale()</a></span>.
     Явный вызов <span class="function"><a href="function.setlocale.php" class="function">setlocale()</a></span> теперь требуется всегда, если компонент локали должен
     быть изменён с значения по умолчанию.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Устаревший резервный вариант DES в <span class="function"><a href="function.crypt.php" class="function">crypt()</a></span> был удалён. Если
     в <span class="function"><a href="function.crypt.php" class="function">crypt()</a></span> передаётся неизвестный формат соли,
     функция завершится ошибкой с <code class="literal">*0</code>
     вместо возврата к слабому хешу DES.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     При указании значений вне допустимого диапазона для SHA256/SHA512 <span class="function"><a href="function.crypt.php" class="function">crypt()</a></span>
     теперь будет выдана ошибка <code class="literal">*0</code> вместо ограничения до ближайшего предела.
     Это соответствует поведению glibc.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Результат функций сортировки мог измениться, если в массиве есть одинаковые элементы.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Любые функции, принимающие callback-функции, которые явно не указаны для приёма параметров
     по ссылке, теперь будут предупреждать, если используется callback-функция со ссылочными параметрами. Например,
     <span class="function"><a href="function.array-filter.php" class="function">array_filter()</a></span> и <span class="function"><a href="function.array-reduce.php" class="function">array_reduce()</a></span>. Ранее так было у большинства функций,
     но не у всех.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Обёртка HTTP-потока, используемая такими функциями, как <span class="function"><a href="function.file-get-contents.php" class="function">file_get_contents()</a></span>,
     теперь по умолчанию объявляет HTTP/1.1, а не HTTP/1.0. Это не меняет поведения
     клиента, но может заставить серверы реагировать по-другому. Чтобы сохранить старое поведение, установите
     параметр контекста потока <code class="literal">&#039;protocol_version&#039;</code>, например:
    </p>
    <p class="para">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$ctx </span><span style="color: #007700">= </span><span style="color: #0000BB">stream_context_create</span><span style="color: #007700">([</span><span style="color: #DD0000">'http' </span><span style="color: #007700">=&gt; [</span><span style="color: #DD0000">'protocol_version' </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">'1.0'</span><span style="color: #007700">]]);<br />echo </span><span style="color: #0000BB">file_get_contents</span><span style="color: #007700">(</span><span style="color: #DD0000">'http://example.org'</span><span style="color: #007700">, </span><span style="color: #0000BB">false</span><span style="color: #007700">, </span><span style="color: #0000BB">$ctx</span><span style="color: #007700">);<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.crypt.php" class="function">crypt()</a></span> без явной передачи соли больше не поддерживается. Если вы хотите
     создать надёжный хеш с автоматически сгенерированной солью,
     используйте вместо этого <span class="function"><a href="function.password-hash.php" class="function">password_hash()</a></span>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.substr.php" class="function">substr()</a></span>, <span class="function"><a href="function.mb-substr.php" class="function">mb_substr()</a></span>, <span class="function"><a href="function.iconv-substr.php" class="function">iconv_substr()</a></span> и
     <span class="function"><a href="function.grapheme-substr.php" class="function">grapheme_substr()</a></span> теперь последовательно фиксируют смещения за пределы
     границы строки. Ранее, в некоторых случаях, вместо пустой строки возвращался <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     В Windows функции выполнения программ (<span class="function"><a href="function.proc-open.php" class="function">proc_open()</a></span>, <span class="function"><a href="function.exec.php" class="function">exec()</a></span>,
     <span class="function"><a href="function.popen.php" class="function">popen()</a></span> и т. д.) с использованием оболочки теперь последовательно выполняют <strong class="command">%comspec% /s
     /c &quot;$commandline&quot;</strong>, которая делает то же самое, что и выполнение
     <strong class="command">$commandline</strong> (без дополнительных кавычек).
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.sysvsem">
  <h3 class="title">Sysvsem</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Параметр <code class="parameter">auto_release</code> в <span class="function"><a href="function.sem-get.php" class="function">sem_get()</a></span> был изменён,
     чтобы принимать логические значения (bool), а не целые числа (int).
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.tidy">
  <h3 class="title">Tidy</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     Параметр <code class="parameter">use_include_path</code>, который не использовался внутренне, был удалён
     из <span class="function"><a href="tidy.repairstring.php" class="function">tidy_repair_string()</a></span>.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <span class="methodname"><a href="tidy.repairstring.php" class="methodname">tidy::repairString()</a></span> и <span class="methodname"><a href="tidy.repairfile.php" class="methodname">tidy::repairFile()</a></span> стали
     статическими методами.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.tokenizer">
  <h3 class="title">PHP-лексер (Tokenizer)</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     В лексемах <strong><code><a href="tokens.php#constant.t-comment">T_COMMENT</a></code></strong> больше не будет символа новой строки в конце.
     Вместо этого новая строка будет частью следующий лексемы <strong><code><a href="tokens.php#constant.t-whitespace">T_WHITESPACE</a></code></strong>.
     Следует отметить, что за лексемой <strong><code><a href="tokens.php#constant.t-comment">T_COMMENT</a></code></strong> не всегда идёт пробел, за ней
     также может следовать лексема <strong><code><a href="tokens.php#constant.t-close-tag">T_CLOSE_TAG</a></code></strong> или конец файла.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     Имена пространств имён теперь представлены через лексемы <strong><code><a href="tokens.php#constant.t-name-qualified">T_NAME_QUALIFIED</a></code></strong> (<code class="code">Foo\Bar</code>),
     <strong><code><a href="tokens.php#constant.t-name-fully-qualified">T_NAME_FULLY_QUALIFIED</a></code></strong> (<code class="code">\Foo\Bar</code>)
     и <strong><code><a href="tokens.php#constant.t-name-relative">T_NAME_RELATIVE</a></code></strong> (<code class="code">namespace\Foo\Bar</code>).
     PHP-лексер использует лексему <strong><code><a href="tokens.php#constant.t-ns-separator">T_NS_SEPARATOR</a></code></strong> только для автономных разделителей пространства имён
     и лексема синтаксически действительна только в сочетании с объявлениями группового использования.
     
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.xmlreader">
  <h3 class="title">XMLReader</h3>

  <p class="para">
   Методы <span class="methodname"><a href="xmlreader.open.php" class="methodname">XMLReader::open()</a></span> и <span class="methodname"><a href="xmlreader.xml.php" class="methodname">XMLReader::XML()</a></span>
   стали статическими. Методы по-прежнему разрешается вызывать как методы экземпляра, но в классах-наследниках потребуется
   объявить методы статическими, если в дочернем классе они переопределяют методы родительского класса.
  </p>
 </div>

 <div class="sect2" id="migration80.incompatible.xmlrpc">
  <h3 class="title">XML-RPC</h3>

  <p class="para">
   Модуль XML-RPC был перемещён в PECL и больше не является частью
   дистрибутива PHP.
  </p>
 </div>

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

  <p class="para">
   <strong><code>ZipArchive::OPSYS_Z_CPM</code></strong> была удалена (в этом имени была опечатка). Используйте
   вместо неё <strong><code><a href="zip.constants.php#ziparchive.constants.opsys-cpm">ZipArchive::OPSYS_CPM</a></code></strong>.
  </p>
 </div>

 <div class="sect2" id="migration80.incompatible.zlib">
  <h3 class="title">Zlib</h3>

  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     <span class="function"><a href="function.gzgetss.php" class="function">gzgetss()</a></span> удалена.
    </p>
   </li>
   <li class="listitem">
    <p class="para">
     <a href="zlib.configuration.php#ini.zlib.output-compression" class="link">zlib.output_compression</a> больше не
     отключается автоматически для <code class="literal">Content-Type: image/*</code>.
    </p>
   </li>
  </ul>
 </div>

 <div class="sect2" id="migration80.incompatible.php-test-packs">
  <h3 class="title">Пакеты тестов PHP для Windows</h3>

  <p class="para">
   Скрипт выполнения тестов был переименован из <var class="filename">run-test.php</var>
   в <var class="filename">run-tests.php</var>, чтобы соответствовать его имени в php-src.
  </p>
 </div>
</div><?php manual_footer($setup); ?>