<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/migration84.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ru',
  ),
  'this' => 
  array (
    0 => 'migration84.new-features.php',
    1 => 'Новая функциональность',
    2 => 'Новая функциональность',
  ),
  'up' => 
  array (
    0 => 'migration84.php',
    1 => 'Миграция с PHP 8.3.x на PHP 8.4.x',
  ),
  'prev' => 
  array (
    0 => 'migration84.php',
    1 => 'Миграция с PHP 8.3.x на PHP 8.4.x',
  ),
  'next' => 
  array (
    0 => 'migration84.new-classes.php',
    1 => 'Новые классы, перечисления и интерфейсы',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'appendices/migration84/new-features.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="migration84.new-features" class="sect1">
 <h2 class="title">Новая функциональность</h2>

 
 <div class="sect2" id="migration84.new-features.core">
  <h3 class="title">Ядро PHP</h3>

  
  <div class="sect3" id="migration84.new-features.core.property-hooks">
   <h4 class="title">Хуки для свойств объектов</h4>

   <p class="simpara">
    Операциям чтения и записи свойств объектов теперь разрешили добавлять логику поведения.
    Дополнительную логику добавляют через хук <code class="literal">get</code>, который срабатывает при чтении свойства,
    и хук <code class="literal">set</code>, который срабатывает при записи значения в свойство объекта.
    Хуки умеют делать свойства виртуальными — без реальных значений.
   </p>

   <div class="informalexample">
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Person<br /></span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">// «Виртуальное» свойство. Невозможно установить значение виртуального свойства явным образом<br />    </span><span style="color: #007700">public </span><span style="color: #0000BB">string $fullName<br />    </span><span style="color: #007700">{<br />        </span><span style="color: #0000BB">get </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">firstName </span><span style="color: #007700">. </span><span style="color: #DD0000">' ' </span><span style="color: #007700">. </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">lastName</span><span style="color: #007700">;<br />    }<br /><br />    </span><span style="color: #FF8000">// Каждая операция записи значения свойства пройдёт через хук. В свойство в итоге запишется значение, которое вернётся из хука.<br />    // Доступ к свойству для чтения значения проходит в стандартном режиме<br />    </span><span style="color: #007700">public </span><span style="color: #0000BB">string $firstName<br />    </span><span style="color: #007700">{<br />        </span><span style="color: #0000BB">set </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">mb_ucfirst</span><span style="color: #007700">(</span><span style="color: #0000BB">strtolower</span><span style="color: #007700">(</span><span style="color: #0000BB">$value</span><span style="color: #007700">));<br />    }<br /><br />    </span><span style="color: #FF8000">// Каждая операция записи значения свойства пройдёт через хук, который сам запишет реальное значение свойства.<br />    // Доступ к свойству для чтения значения проходит в стандартном режиме<br />    </span><span style="color: #007700">public </span><span style="color: #0000BB">string $lastName<br />    </span><span style="color: #007700">{<br />        </span><span style="color: #0000BB">set </span><span style="color: #007700">{<br />            if (</span><span style="color: #0000BB">strlen</span><span style="color: #007700">(</span><span style="color: #0000BB">$value</span><span style="color: #007700">) &lt; </span><span style="color: #0000BB">2</span><span style="color: #007700">) {<br />                throw new </span><span style="color: #0000BB">\InvalidArgumentException</span><span style="color: #007700">(</span><span style="color: #DD0000">'Слишком короткая фамилия'</span><span style="color: #007700">);<br />            }<br /><br />            </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">lastName </span><span style="color: #007700">= </span><span style="color: #0000BB">$value</span><span style="color: #007700">;<br />        }<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$p </span><span style="color: #007700">= new </span><span style="color: #0000BB">Person</span><span style="color: #007700">();<br /><br /></span><span style="color: #0000BB">$p</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">firstName </span><span style="color: #007700">= </span><span style="color: #DD0000">'пётр'</span><span style="color: #007700">;<br />print </span><span style="color: #0000BB">$p</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">firstName</span><span style="color: #007700">; </span><span style="color: #FF8000">// Конструкция выведет "Пётр"<br /><br /></span><span style="color: #0000BB">$p</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">lastName </span><span style="color: #007700">= </span><span style="color: #DD0000">'Петров'</span><span style="color: #007700">;<br />print </span><span style="color: #0000BB">$p</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">fullName</span><span style="color: #007700">; </span><span style="color: #FF8000">// Конструкция выведет "Пётр Петров"<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </div>

  
  <div class="sect3" id="migration84.new-features.core.asymmetric-property-visibility">
   <h4 class="title">Асимметричная видимость свойств объектов</h4>

   <p class="simpara">
    Видимостью свойств объектов для операций записи значения — <code class="literal">set</code>
    теперь разрешили управлять отдельно от видимости свойств для операций чтения — <code class="literal">get</code>.
   </p>
   <div class="informalexample">
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Example<br /></span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">// Первый модификатор управляет видимостью свойства для чтения, второй — видимостью для записи.<br />    // Видимость для чтения нельзя сужать сильнее видимости для записи<br />    </span><span style="color: #007700">public protected(</span><span style="color: #0000BB">set</span><span style="color: #007700">) </span><span style="color: #0000BB">string $name</span><span style="color: #007700">;<br /><br />    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(</span><span style="color: #0000BB">string $name</span><span style="color: #007700">)<br />    {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">name </span><span style="color: #007700">= </span><span style="color: #0000BB">$name</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </div>

  
  <div class="sect3" id="migration84.new-features.core.lazy-objects">
   <h4 class="title">Ленивые объекты</h4>
   <p class="simpara">
    С PHP 8.4.0 разрешили создавать объекты, инициализация которых откладывается
    до обращения к объекту.
    За счёт ленивых объектов библиотеки и фреймворки получают доступ к отсрочке
    получения данных или зависимостей, которые требуются для инициализации.
   </p>
   <div class="informalexample">
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Example<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(private </span><span style="color: #0000BB">int $data</span><span style="color: #007700">) {}<br /><br />    </span><span style="color: #FF8000">// ...<br /></span><span style="color: #007700">}<br /><br /></span><span style="color: #0000BB">$initializer </span><span style="color: #007700">= static function (</span><span style="color: #0000BB">Example $ghost</span><span style="color: #007700">): </span><span style="color: #0000BB">void </span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">// Fetch data or dependencies<br />    </span><span style="color: #0000BB">$data </span><span style="color: #007700">= </span><span style="color: #0000BB">getData</span><span style="color: #007700">();<br /><br />    </span><span style="color: #FF8000">// Initialize<br />    </span><span style="color: #0000BB">$ghost</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">__construct</span><span style="color: #007700">(</span><span style="color: #0000BB">$data</span><span style="color: #007700">);<br />};<br /><br /></span><span style="color: #0000BB">$reflector </span><span style="color: #007700">= new </span><span style="color: #0000BB">ReflectionClass</span><span style="color: #007700">(</span><span style="color: #0000BB">Example</span><span style="color: #007700">::class);<br /></span><span style="color: #0000BB">$object </span><span style="color: #007700">= </span><span style="color: #0000BB">$reflector</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">newLazyGhost</span><span style="color: #007700">(</span><span style="color: #0000BB">$initializer</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </div>

  
  <div class="sect3" id="migration84.new-features.core.deprecated-attribute">
   <h4 class="title">Атрибут <code class="code">#[\Deprecated]</code></h4>

   <p class="simpara">
    Новый атрибут <span class="classname"><a href="class.deprecated.php" class="classname">Deprecated</a></span> помечает функции, методы
    и константы классов устаревшими. Поведение функциональности, которую пометили устаревшей
    этим атрибутом, совпадает с поведением механизма устаревания функциональности,
    которую предоставляет сам PHP. Единственное отличие состоит в том, что вместо кода ошибки
    <strong><code><a href="errorfunc.constants.php#constant.e-deprecated">E_DEPRECATED</a></code></strong> PHP выдаст ошибку уровня
    <strong><code><a href="errorfunc.constants.php#constant.e-user-deprecated">E_USER_DEPRECATED</a></code></strong>.
   </p>

   <p class="simpara">
    Функциональность самого PHP, которая устарела прежде, обновили
    и пометили этим атрибутом, что улучшило выдаваемые сообщения об ошибках
    за счёт включения краткого пояснения.
   </p>
  </div>

  
  <div class="sect3" id="migration84.new-features.core.rfc1867">
   <h4 class="title">
    Разбор HTTP-запросов, метод которых отличается от POST,
    при передаче многокомпонентного содержимого по стандарту RFC1867
   </h4>

   
   <p class="simpara">
    Для разбора multipart-запросов по протоколу HTTP, которые определяет
    стандарт RFC1867 (multipart) и метод HTTP-запроса которых отличается от метода POST,
    добавили функцию <span class="function"><a href="function.request-parse-body.php" class="function">request_parse_body()</a></span>.
   </p>
  </div>

  
  <div class="sect3" id="migration84.new-features.core.new-chaining">
   <h4 class="title">Объединение в цепочку вызовов выражения <a href="language.oop5.basic.php#language.oop5.basic.new" class="link"><code class="literal">new</code></a> без круглых скобок</h4>

   
   <p class="simpara">
    Выражениям, которыми создают новый объект с аргументами конструктора, теперь доступно разыменование,
    поэтому такие выражения разрешают по цепочке вызывать методы, получать доступ к свойствам объекта,
    и обращаться к другим членам объекта без заключения выражения в круглые скобки.
   </p>
  </div>

  <div class="sect3" id="migration84.new-features.core.debug-weakref">
   <h4 class="title">Улучшение отладочной информации об объектах класса <span class="classname"><a href="class.weakreference.php" class="classname">WeakReference</a></span></h4>

   
   <p class="simpara">
    Получение отладочной информации об слабых ссылках, которые представляет класс <span class="classname"><a href="class.weakreference.php" class="classname">WeakReference</a></span>,
    теперь также выведет объект, на который ссылается слабая ссылка, или <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>, если ссылка больше
    недействительна.
   </p>
  </div>

  <div class="sect3" id="migration84.new-features.core.debug-closure">
   <h4 class="title">Улучшение отладочной информации об объектах класса <span class="classname"><a href="class.closure.php" class="classname">Closure</a></span></h4>

   
   <p class="simpara">
    Вывод магического метода <span class="methodname"><strong>Closure::__debugInfo()</strong></span> теперь включает
    название функции или метода, который вернул замыкание <span class="classname"><a href="class.closure.php" class="classname">Closure</a></span>,
    а также путь к файлу и строку, на которой определили замыкание.
   </p>
  </div>

  
  <div class="sect3" id="migration84.new-features.core.multiple-namespaces-symbols">
   <h4 class="title">Определение идентичных символов в разных блоках пространства имён</h4>

   
   <p class="simpara">
    Выход из пространства имён теперь очищает видимые символы.
    Это разрешает использовать символ в блоке пространства имён, даже если предыдущий блок
    пространства имён объявил символ с тем же именем.
    
   </p>
  </div>

 </div>

 <div class="sect2" id="migration84.new-features.curl">
  <h3 class="title">Модуль cURL</h3>

  <p class="simpara">
   Функция <span class="function"><a href="function.curl-version.php" class="function">curl_version()</a></span> возвращает дополнительное
   значение <code class="literal">feature_list</code> — ассоциативный массив
   со списком известных функций cURL, и поддерживаются ли они: <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>, если да,
   или <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>, если нет.
  </p>

  <p class="simpara">
   Добавили константы <strong><code><a href="curl.constants.php#constant.curl-http-version-3">CURL_HTTP_VERSION_3</a></code></strong>
   и <strong><code><a href="curl.constants.php#constant.curl-http-version-3only">CURL_HTTP_VERSION_3ONLY</a></code></strong> (доступны
   с libcurl 7.66 и 7.88) как доступные флаги
   для опции <strong><code><a href="curl.constants.php#constant.curlopt-http-version">CURLOPT_HTTP_VERSION</a></code></strong>.
  </p>

  <p class="simpara">
   Добавили константу <strong><code><a href="curl.constants.php#constant.curlopt-prereqfunction">CURLOPT_PREREQFUNCTION</a></code></strong> — опция модуля cURL,
   которая принимает значение с типом <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span>, которое вызовет после установки соединения,
   но до отправки запроса. К функции обратного вызова предъявляется требование:
   вернуть или значение <strong><code><a href="curl.constants.php#constant.curl-prereqfunc-ok">CURL_PREREQFUNC_OK</a></code></strong>, чтобы разрешить,
   или значение <strong><code><a href="curl.constants.php#constant.curl-prereqfunc-abort">CURL_PREREQFUNC_ABORT</a></code></strong>, чтобы прервать запрос.
  </p>

  <p class="simpara">
   Добавили опцию <strong><code><a href="curl.constants.php#constant.curlopt-server-response-timeout">CURLOPT_SERVER_RESPONSE_TIMEOUT</a></code></strong>,
   которая заменила опцию с названием <strong><code><a href="curl.constants.php#constant.curlopt-ftp-response-timeout">CURLOPT_FTP_RESPONSE_TIMEOUT</a></code></strong>.
   Обе константы содержат одно и то же значение.
  </p>

  <p class="para">
   Добавили константу <strong><code><a href="curl.constants.php#constant.curlopt-debugfunction">CURLOPT_DEBUGFUNCTION</a></code></strong> — опция модуля cURL,
   которая принимает значение с типом <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span>. Callback-функция
   вызывается в течение жизни запроса, который обрабатывается объектом <span class="classname"><a href="class.curlhandle.php" class="classname">CurlHandle</a></span>.
   Функция обратного вызова получает целое число, которое содержит тип отладочного сообщения,
   и строку, которая содержит отладочное сообщение.
   Тип отладочного сообщения получает значение константы из следующего списка:
   <ul class="simplelist">
    <li><strong><code><a href="curl.constants.php#constant.curlinfo-text">CURLINFO_TEXT</a></code></strong></li>
    <li><strong><code><a href="curl.constants.php#constant.curlinfo-header-in">CURLINFO_HEADER_IN</a></code></strong></li>
    <li><strong><code><a href="curl.constants.php#constant.curlinfo-header-out">CURLINFO_HEADER_OUT</a></code></strong></li>
    <li><strong><code><a href="curl.constants.php#constant.curlinfo-data-in">CURLINFO_DATA_IN</a></code></strong></li>
    <li><strong><code><a href="curl.constants.php#constant.curlinfo-data-out">CURLINFO_DATA_OUT</a></code></strong></li>
    <li><strong><code><a href="curl.constants.php#constant.curlinfo-ssl-data-in">CURLINFO_SSL_DATA_IN</a></code></strong></li>
    <li><strong><code><a href="curl.constants.php#constant.curlinfo-ssl-data-out">CURLINFO_SSL_DATA_OUT</a></code></strong></li>
   </ul>
   При установке отладочной опции нельзя устанавливать параметр <strong><code><a href="curl.constants.php#constant.curlinfo-header-out">CURLINFO_HEADER_OUT</a></code></strong>,
   потому что параметр использует ту же функциональность библиотеки libcurl.
  </p>

  <p class="simpara">
   Функция <span class="function"><a href="function.curl-getinfo.php" class="function">curl_getinfo()</a></span> теперь возвращает дополнительный
   ключ <code class="literal">posttransfer_time_us</code>, который содержит количество
   микросекунд от начала передачи до отправки последнего байта.
   При перенаправлениях время каждого запроса суммируется.
   Это значение также возвращает функция <span class="function"><a href="function.curl-getinfo.php" class="function">curl_getinfo()</a></span>
   при вызове с аргументом <strong><code><a href="curl.constants.php#constant.curlinfo-posttransfer-time-t">CURLINFO_POSTTRANSFER_TIME_T</a></code></strong>
   для параметра <code class="parameter">option</code>.
   Для этого требуется библиотека libcurl 8.10.0 или новее.
  </p>
 </div>

 <div class="sect2" id="migration84.new-features.dom">
  <h3 class="title">Модуль DOM</h3>

  
  
  <p class="simpara">
   В модуль добавили пространство имён <span class="package">Dom</span> с новыми классами наподобие
   <span class="classname"><a href="class.dom-node.php" class="classname">Dom\Node</a></span>, который работает аналогично прежнему классу
   <span class="classname"><a href="class.domnode.php" class="classname">DOMNode</a></span>. Новые классы совместимы с языком разметки HTML 5
   и соответствуют спецификации WHATWG; новые классы
   решают давние ошибки в модуле DOM.
   Старые классы модуля DOM остаются доступны в целях сохранения обратной совместимости.
  </p>

  <p class="para">
   Добавили метод <span class="methodname"><a href="domnode.comparedocumentposition.php" class="methodname">DOMNode::compareDocumentPosition()</a></span>
   и связанные с ним константы:
   <ul class="simplelist">
    <li><strong><code><a href="class.domnode.php#domnode.constants.document-position-disconnected">DOMNode::DOCUMENT_POSITION_DISCONNECTED</a></code></strong></li>
    <li><strong><code><a href="class.domnode.php#domnode.constants.document-position-preceding">DOMNode::DOCUMENT_POSITION_PRECEDING</a></code></strong></li>
    <li><strong><code><a href="class.domnode.php#domnode.constants.document-position-following">DOMNode::DOCUMENT_POSITION_FOLLOWING</a></code></strong></li>
    <li><strong><code><a href="class.domnode.php#domnode.constants.document-position-contains">DOMNode::DOCUMENT_POSITION_CONTAINS</a></code></strong></li>
    <li><strong><code><a href="class.domnode.php#domnode.constants.document-position-contained-by">DOMNode::DOCUMENT_POSITION_CONTAINED_BY</a></code></strong></li>
    <li><strong><code><a href="class.domnode.php#domnode.constants.document-position-implementation-specific">DOMNode::DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC</a></code></strong></li>
   </ul>
  </p>

  
  <p class="simpara">
   Метод <span class="methodname"><a href="domxpath.registerphpfunctions.php" class="methodname">DOMXPath::registerPhpFunctions()</a></span> теперь принимает callable-значения.

   Кроме того, метод <span class="methodname"><a href="domxpath.registerphpfunctionns.php" class="methodname">DOMXPath::registerPhpFunctionNs()</a></span>
   теперь умеет регистрировать callback-функции, которые будут использовать свой
   синтаксис вызова функции, а не вызовы вроде <code class="code">php:function(&#039;name&#039;)</code>.
  </p>
 </div>

 <div class="sect2" id="migration84.new-features.intl">
  <h3 class="title">Модуль Intl</h3>

  <p class="simpara">
   Режим округления <strong><code><a href="class.numberformatter.php#numberformatter.constants.round-halfeven">NumberFormatter::ROUND_HALFEVEN</a></code></strong>
   дополнили новым режимом <strong><code><a href="class.numberformatter.php#numberformatter.constants.round-halfodd">NumberFormatter::ROUND_HALFODD</a></code></strong>.
  </p>
 </div>

 <div class="sect2" id="migration84.new-features.openssl">
  <h3 class="title">Модуль OpenSSL</h3>

  <p class="simpara">
   Добавили поддержку ключей на основе эллиптических кривых Curve25519 + Curve448.
   В частности, поля x25519, ed25519, x448 и ed448 поддерживаются в функциях
   <span class="function"><a href="function.openssl-pkey-new.php" class="function">openssl_pkey_new()</a></span>,
   <span class="function"><a href="function.openssl-pkey-get-details.php" class="function">openssl_pkey_get_details()</a></span>,
   <span class="function"><a href="function.openssl-sign.php" class="function">openssl_sign()</a></span>
   и <span class="function"><a href="function.openssl-verify.php" class="function">openssl_verify()</a></span>, которые расширили для поддержки этих ключей.
  </p>

  <p class="simpara">
   Реализовали хеширование паролей алгоритмом PASSWORD_ARGON2.
   Для этого требуется модуль OpenSSL 3.2 и NTS-сборка (англ. сокр.: Non-Thread Safe).
  </p>
 </div>

 <div class="sect2" id="migration84.new-features.pcre">
  <h3 class="title">Модуль PCRE</h3>

  <p class="simpara">
   Библиотеку pcre2lib, которая поставляется в комплекте с PHP, обновили до версии 10.44.
   Поэтому добавили поддержку JIT-компилятором процессорной архитектуры LoongArch,
   в Perl-совместимых элементах между фигурными скобками разрешили пробелы
   и теперь поддерживаются ретроспективные проверки переменной длины.
  </p>

  <p class="simpara">
   В библиотеке pcre2lib версии 10.44 максимальную длину меток именованных групп захвата
   изменили с <code class="literal">32</code> до <code class="literal">128</code> символов.
  </p>

  <p class="simpara">
   Добавили поддержку модификатора <code class="literal">r</code> (PCRE2_EXTRA_CASELESS_RESTRICT)
   и модификатора режима <code class="literal">(?r)</code>.
   При включении вместе с модификатором (<code class="literal">i</code>), который включает регистронезависимый поиск,
   выражение блокирует смешивание ASCII-символов и символов, которые не входят в кодировку ASCII.
  </p>
 </div>

 <div class="sect2" id="migration84.new-features.pdo">
  <h3 class="title">Модуль PDO</h3>

  
  <p class="simpara">
   Добавили подклассы, характерные для драйверов,
   чтобы лучше поддерживать функциональность, специфичную для баз данных.
   Новые классы модуля PDO улучшают поддержку функциональности,
   характерной для конкретных баз данных.
   Новые классы могут быть инициализированы либо с помощью метода <span class="methodname"><a href="pdo.connect.php" class="methodname">PDO::connect()</a></span>,
   либо непосредственно инициализировав один из подклассов, характерных для драйверов.
  </p>

  
  <p class="para">
   Добавлена поддержка SQL-парсеров, характерных для конкретных драйверов.
   Если парсер для конкретного драйвера недоступен, используется парсер по умолчанию.
   Парсер по умолчанию поддерживает:
   <ul class="simplelist">
    <li>
     литералы в одинарных и двойных кавычках с удвоением в качестве механизма экранирования
    </li>
    <li>
     комментарии, которые начинаются с двух дефисов, и невложенные комментарии в стиле языка C
    </li>
   </ul>
  </p>
 </div>

 <div class="sect2" id="migration84.new-features.pdo-mysql">
  <h3 class="title">Драйвер PDO_MYSQL</h3>

  
  <p class="para">
   Добавили пользовательский парсер, который поддерживает:
   <ul class="simplelist">
    <li>
     литералы в одинарных и двойных кавычках с удвоением и обратным слешем
     в качестве механизма экранирования
    </li>
    <li>
     литеральные идентификаторы с обратными машинописными апострофами, или обратными кавычками,
     с удвоением в качестве механизма экранирования
    </li>
    <li>
     комментарии, которые начинаются с двух дефисов, за которыми следует как минимум один пробел,
     невложенные комментарии в стиле языка C и комментарии, которые начинаются с символа решётки
    </li>
   </ul>
  </p>
 </div>

 <div class="sect2" id="migration84.new-features.pdo-pgsql">
  <h3 class="title">Драйвер PDO_PGSQL</h3>

  
  <p class="para">
   Добавили пользовательский парсер, который поддерживает:
   <ul class="simplelist">
    <li>
     литералы в одинарных и двойных кавычках с удвоением в качестве механизма экранирования
    </li>
    <li>
     «экранирование» строковых литералов в стиле языка C: <code class="literal">E&#039;string&#039;</code>
    </li>
    <li>
     строковые литералы между знаками долларов
    </li>
    <li>
     Комментарии, которые начинаются с двух дефисов, и невложенные комментарии в стиле языка C
    </li>
    <li>
     экранирование оператора <code class="literal">?</code>
     последовательностью символов <code class="literal">??</code>
    </li>
   </ul>
  </p>
 </div>

 <div class="sect2" id="migration84.new-features.pdo-sqlite">
  <h3 class="title">Драйвер PDO_SQLITE</h3>

  
  <p class="para">
   Добавили пользовательский парсер, который поддерживает:
   <ul class="simplelist">
    <li>
     литералы в одинарных, двойных и обратных кавычках с удвоением в качестве
     механизма экранирования
    </li>
    <li>
     идентификаторы в квадратных скобках
    </li>
    <li>
     Комментарии, которые начинаются с двух дефисов, и невложенные комментарии в стиле языка C
    </li>
   </ul>
  </p>
 </div>

 <div class="sect2" id="migration84.new-features.phar">
  <h3 class="title">Модуль Phar</h3>

  <p class="simpara">
   Добавили поддержку модуля меток времени Unix для Zip-архивов.
  </p>
 </div>

 <div class="sect2" id="migration84.new-features.readline">
  <h3 class="title">Модуль Readline</h3>

  <p class="simpara">
   Добавили поддержку изменения пути <code class="literal">.php_history</code>
   через переменную окружения <var class="envar">PHP_HISTFILE</var>.
  </p>
 </div>

 <div class="sect2" id="migration84.new-features.reflection">
  <h3 class="title">Модуль Reflection</h3>

  <p class="simpara">
   Класс <span class="classname"><a href="class.reflectionattribute.php" class="classname">ReflectionAttribute</a></span> теперь содержит
   свойство <span class="property">name</span>, чтобы улучшить опыт отладки.
  </p>

  <p class="simpara">
   Методы <span class="methodname"><a href="reflectionclassconstant.tostring.php" class="methodname">ReflectionClassConstant::__toString()</a></span>
   и <span class="methodname"><a href="reflectionproperty.tostring.php" class="methodname">ReflectionProperty::__toString()</a></span> теперь возвращают
   комментарии, которые прикрепили к документу.
  </p>

  
  <p class="para">
   Добавили новые методы и константы ленивых объектов:

   <ul class="simplelist">
    <li>
     <span class="methodname"><a href="reflectionclass.newlazyghost.php" class="methodname">ReflectionClass::newLazyGhost()</a></span>
    </li>
    <li>
     <span class="methodname"><a href="reflectionclass.newlazyproxy.php" class="methodname">ReflectionClass::newLazyProxy()</a></span>
    </li>
    <li>
     <span class="methodname"><a href="reflectionclass.resetaslazyghost.php" class="methodname">ReflectionClass::resetAsLazyGhost()</a></span>
    </li>
    <li>
     <span class="methodname"><a href="reflectionclass.resetaslazyproxy.php" class="methodname">ReflectionClass::resetAsLazyProxy()</a></span>
    </li>
    <li>
     <span class="methodname"><a href="reflectionclass.isuninitializedlazyobject.php" class="methodname">ReflectionClass::isUninitializedLazyObject()</a></span>
    </li>
    <li>
     <span class="methodname"><a href="reflectionclass.initializelazyobject.php" class="methodname">ReflectionClass::initializeLazyObject()</a></span>
    </li>
    <li>
     <span class="methodname"><a href="reflectionclass.marklazyobjectasinitialized.php" class="methodname">ReflectionClass::markLazyObjectAsInitialized()</a></span>
    </li>
    <li>
     <span class="methodname"><a href="reflectionclass.getlazyinitializer.php" class="methodname">ReflectionClass::getLazyInitializer()</a></span>
    </li>
    <li>
     <span class="methodname"><a href="reflectionproperty.skiplazyinitialization.php" class="methodname">ReflectionProperty::skipLazyInitialization()</a></span>
    </li>
    <li>
     <span class="methodname"><a href="reflectionproperty.setrawvaluewithoutlazyinitialization.php" class="methodname">ReflectionProperty::setRawValueWithoutLazyInitialization()</a></span>
    </li>
    <li>
     <strong><code><a href="class.reflectionclass.php#reflectionclass.constants.skip-initialization-on-serialize">ReflectionClass::SKIP_INITIALIZATION_ON_SERIALIZE</a></code></strong>
    </li>
    <li>
     <strong><code><a href="class.reflectionclass.php#reflectionclass.constants.skip-destructor">ReflectionClass::SKIP_DESTRUCTOR</a></code></strong>
    </li>
   </ul>
  </p>
 </div>

 <div class="sect2" id="migration84.new-features.soap">
  <h3 class="title">Модуль SOAP</h3>

  <p class="simpara">
   Добавили поддержку нотации Кларка для пространств имён в карте классов.

   В карте классов теперь разрешается указывать записи в нотации Кларка,
   чтобы тип с конкретным пространством имён разрешался в конкретным класс.
   Например: <code class="code">&#039;{http://example.com}foo&#039; =&gt; &#039;FooClass&#039;</code>.
  </p>

  <p class="simpara">
   Экземпляры интерфейса <span class="interfacename"><a href="class.datetimeinterface.php" class="interfacename">DateTimeInterface</a></span>, которые
   передали в <code class="literal">xsd:datetime</code> или похожие элементы, теперь
   сериализуются как таковые, а не как пустая строка.
  </p>

  <p class="simpara">
   Сохранение сессий теперь работает с общим модулем сессий.
  </p>
 </div>

 <div class="sect2" id="migration84.new-features.standard">
  <h3 class="title">Стандартные модули</h3>

  
  <p class="simpara">
   
   Добавили новое перечисление <span class="classname"><a href="enum.roundingmode.php" class="classname">RoundingMode</a></span> с понятными названиями
   и улучшенной по сравнению с константами семейства
   <strong><code><a href="math.constants.php#constant.php-round-half-up">PHP_ROUND_<span class="replaceable">*</span></a></code></strong> обнаруживаемостью.
   Более того, добавили четыре новых режима округления,
   которые доступны только через новое перечисление <span class="classname"><a href="enum.roundingmode.php" class="classname">RoundingMode</a></span>.
  </p>
 </div>

 <div class="sect2" id="migration84.new-features.xsl">
  <h3 class="title">Модуль XSL</h3>

  <p class="simpara">
   Разрешили параметры, которые содержат как одинарные, так и двойные кавычки.
  </p>

  
  <p class="simpara">
   В метод <span class="methodname"><a href="xsltprocessor.registerphpfunctions.php" class="methodname">XSLTProcessor::registerPhpFunctions()</a></span>
   разрешили передавать callable-значения не только в виде строк или массивов,
   но и в других форматах, которые поддерживает PHP.
   
  </p>

  <p class="simpara">
   Добавили свойства <span class="property"><a href="class.xsltprocessor.php#xsltprocessor.props.maxtemplatedepth">XSLTProcessor::$maxTemplateDepth</a></span>
   и <span class="property"><a href="class.xsltprocessor.php#xsltprocessor.props.maxtemplatevars">XSLTProcessor::$maxTemplateVars</a></span>
   для управления глубиной рекурсии при оценке XSL-шаблона.
  </p>
 </div>

 <div class="sect2" id="migration84.new-features.zip">
  <h3 class="title">Модуль Zip</h3>

  <p class="simpara">
   Добавили константу <strong><code><a href="zip.constants.php#ziparchive.constants.er-truncated-zip">ZipArchive::ER_TRUNCATED_ZIP</a></code></strong>,
   которую прежде добавили в библиотеку libzip 1.11.
  </p>
 </div>

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