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

contributors($setup);

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

 


<div class="sect2" id="migration70.incompatible.error-handling">
 <h3 class="title">Изменения в обработке ошибок и исключений</h3>

 <p class="para">
  В PHP 7 многие фатальные и поправимые фатальные ошибки
  переделали в исключения. Эти исключения наследуют
  класс <span class="classname"><a href="class.error.php" class="classname">Error</a></span>, который, в свою
  очередь, реализует интерфейс
  <span class="classname"><a href="class.throwable.php" class="classname">Throwable</a></span>
  (новый базовый интерфейс, который наследуют исключения).
 </p>

 <p class="para">
  Поэтому пользовательские обработчики ошибок
  не вызовутся, если вместо вызова ошибки
  выбросится исключение (порождая новые фатальные ошибки
  из-за неперехваченных исключений класса
  <span class="classname"><a href="class.error.php" class="classname">Error</a></span>).
 </p>

 <p class="para">
  Более подробное описание работы ошибок в PHP 7
  даёт страница
  <a href="language.errors.php7.php" class="link">ошибки PHP 7</a>.
  Это руководство только перечисляет изменения, которые
  приводят к обратной несовместимости.
 </p>

 <div class="sect3" id="migration70.incompatible.error-handling.set-exception-handler">
  <h4 class="title">
   Функция <span class="function"><a href="function.set-exception-handler.php" class="function">set_exception_handler()</a></span> больше
   не гарантирует получение объекта класса
   <span class="classname"><a href="class.exception.php" class="classname">Exception</a></span>
  </h4>

  <p class="para">
   Код, который реализует регистрацию обработчика исключений
   функцией <span class="function"><a href="function.set-exception-handler.php" class="function">set_exception_handler()</a></span>
   через декларацию типа
   <span class="classname"><a href="class.exception.php" class="classname">Exception</a></span> вызовет фатальную
   ошибку, если выбросится исключение
   <span class="classname"><a href="class.error.php" class="classname">Error</a></span>.
  </p>

  <p class="para">
   Потребуется убрать объявление класса из обработчика,
   если требуется работа обработчика в PHP 5 и 7. Достаточно
   изменить тип <span class="classname"><a href="class.exception.php" class="classname">Exception</a></span> на тип
   <span class="classname"><a href="class.throwable.php" class="classname">Throwable</a></span>, если код
   планируется использовать только в PHP 7.
  </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: #FF8000">// Только PHP 5. В PHP 7 при исключении другого типа вызывает фатальную ошибку<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">handler</span><span style="color: #007700">(</span><span style="color: #0000BB">Exception $e</span><span style="color: #007700">) { </span><span style="color: #FF8000">/* ... */ </span><span style="color: #007700">}<br /></span><span style="color: #0000BB">set_exception_handler</span><span style="color: #007700">(</span><span style="color: #DD0000">'handler'</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// Будет работать PHP 5 и 7<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">handler</span><span style="color: #007700">(</span><span style="color: #0000BB">$e</span><span style="color: #007700">) { </span><span style="color: #FF8000">/* ... */ </span><span style="color: #007700">}<br /><br /></span><span style="color: #FF8000">// Только PHP 7<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">handler</span><span style="color: #007700">(</span><span style="color: #0000BB">Throwable $e</span><span style="color: #007700">) { </span><span style="color: #FF8000">/* ... */ </span><span style="color: #007700">}<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.error-handling.constructors">
  <h4 class="title">Встроенные конструкторы вызывают исключения при ошибке</h4>

  <p class="para">
   Раньше отдельные внутренние классы возвращали
   <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> или бесполезный объект, когда конструктор терпел неудачу.
   Теперь встроенные классы в таких случаях выбрасывают
   исключение <span class="classname"><a href="class.exception.php" class="classname">Exception</a></span>,
   так же, как это уже делают пользовательские классы.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.error-handling.parse">
  <h4 class="title">Ошибки разбора бросают исключение класса <span class="classname"><a href="class.parseerror.php" class="classname">ParseError</a></span></h4>

  <p class="para">
   Ошибки разбора бросают исключение класса <span class="classname"><a href="class.parseerror.php" class="classname">ParseError</a></span>.
   Обработка ошибок <span class="function"><a href="function.eval.php" class="function">eval()</a></span> должна
   включать в себя блок  <a href="language.exceptions.php#language.exceptions.catch" class="link"><code class="literal">catch</code></a>, который будет ловить эту ошибку.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.error-handling.strict">
  <h4 class="title">Изменение строгости уведомлений E_STRICT</h4>

  <p class="para">
   Сообщения уровня <strong><code><a href="errorfunc.constants.php#constant.e-strict">E_STRICT</a></code></strong>
   переквалифицировали по другим уровням.
   Константу <strong><code><a href="errorfunc.constants.php#constant.e-strict">E_STRICT</a></code></strong> сохранили, поэтому
   установка <code class="literal">error_reporting(E_ALL|E_STRICT)</code> не вызовет
   ошибок.
  </p>
  <p class="para">
   <table class="doctable table">
    <caption><strong>Изменение строгости сообщений <strong><code><a href="errorfunc.constants.php#constant.e-strict">E_STRICT</a></code></strong></strong></caption>
    
     <thead>
      <tr>
       <th>Ситуация</th>
       <th>Новый уровень или поведение</th>
      </tr>

     </thead>

     <tbody class="tbody">
      <tr>
       <td>Установка ресурса как индекса</td>
       <td><strong><code><a href="errorfunc.constants.php#constant.e-notice">E_NOTICE</a></code></strong></td>
      </tr>

      <tr>
       <td>Абстрактные статические методы</td>
       <td>Сообщение убрали, ошибка не возникает</td>
      </tr>

      <tr>
       <td>«Переопределение» конструктора</td>
       <td>Сообщение убрали, ошибка не возникает</td>
      </tr>

      <tr>
       <td>Несоблюдение сигнатуры при наследовании</td>
       <td><strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong></td>
      </tr>

      <tr>
       <td>Одинаковые (совместимые) свойства в двух разных трейтах</td>
       <td>Сообщение убрали, ошибка не возникает</td>
      </tr>

      <tr>
       <td>Нестатический доступ к статическому свойству</td>
       <td><strong><code><a href="errorfunc.constants.php#constant.e-notice">E_NOTICE</a></code></strong></td>
      </tr>

      <tr>
       <td>Только переменные присваиваются по ссылке</td>
       <td><strong><code><a href="errorfunc.constants.php#constant.e-notice">E_NOTICE</a></code></strong></td>
      </tr>

      <tr>
       <td>Только переменные передаются по ссылке</td>
       <td><strong><code><a href="errorfunc.constants.php#constant.e-notice">E_NOTICE</a></code></strong></td>
      </tr>

      <tr>
       <td>Вызов нестатического метода статически</td>
       <td><strong><code><a href="errorfunc.constants.php#constant.e-deprecated">E_DEPRECATED</a></code></strong></td>
      </tr>

     </tbody>
    
   </table>

  </p>
 </div>
</div>


 


<div class="sect2" id="migration70.incompatible.variable-handling">
 <h3 class="title">Изменения в обработке переменных</h3>

 <p class="para">
  PHP 7 использует абстрактное синтаксическое дерево при
  разборе файлов с исходным кодом. Это позволило внести
  множество улучшений в язык, которые ранее были
  невозможны из-за ограничений парсера, использовавшегося в
  предыдущих версиях PHP, но привело к удалению некоторых
  особых возможностей по соображениям согласованности и
  нарушило обратную совместимость. Описание этих
  особых случаев приведено в этой секции.
 </p>

 <div class="sect3" id="migration70.incompatible.variable-handling.indirect">
  <h4 class="title">
   Изменения в обработке непрямых переменных, свойств и
   методов
  </h4>

  <p class="para">
   Непрямой доступ к переменным, свойствам и методам теперь
   раскрывается строго слева-направо, в противовес
   предыдущему сочетанию из специальных правил. В таблице
   представлены изменения в порядке раскрытия.
  </p>

  <p class="para">
   <table class="doctable table">
    <caption><strong>Старая и новая оценка непрямых выражений</strong></caption>
    
     <thead>
      <tr>
       <th>Выражение</th>
       <th>Интерпретация PHP 5</th>
       <th>Интерпретация PHP 7</th>
      </tr>

     </thead>

     <tbody class="tbody">
      <tr>
       <td>
        <code class="code">$$foo[&#039;bar&#039;][&#039;baz&#039;]</code>
       </td>
       <td>
        <code class="code">${$foo[&#039;bar&#039;][&#039;baz&#039;]}</code>
       </td>
       <td>
        <code class="code">($$foo)[&#039;bar&#039;][&#039;baz&#039;]</code>
       </td>
      </tr>

      <tr>
       <td>
        <code class="code">$foo-&gt;$bar[&#039;baz&#039;]</code>
       </td>
       <td>
        <code class="code">$foo-&gt;{$bar[&#039;baz&#039;]}</code>
       </td>
       <td>
        <code class="code">($foo-&gt;$bar)[&#039;baz&#039;]</code>
       </td>
      </tr>

      <tr>
       <td>
        <code class="code">$foo-&gt;$bar[&#039;baz&#039;]()</code>
       </td>
       <td>
        <code class="code">$foo-&gt;{$bar[&#039;baz&#039;]}()</code>
       </td>
       <td>
        <code class="code">($foo-&gt;$bar)[&#039;baz&#039;]()</code>
       </td>
      </tr>

      <tr>
       <td>
        <code class="code">Foo::$bar[&#039;baz&#039;]()</code>
       </td>
       <td>
        <code class="code">Foo::{$bar[&#039;baz&#039;]}()</code>
       </td>
       <td>
        <code class="code">(Foo::$bar)[&#039;baz&#039;]()</code>
       </td>
      </tr>

     </tbody>
    
   </table>

  </p>

  <p class="para">
   Код, использующий старый порядок раскрытия справа-налево,
   должен быть переписан с использованием фигурных скобок
   (смотрите средний столбец в таблице выше). Это сделает код
   рабочим как в PHP 5.x, так и в PHP 7.x.
  </p>
  <p class="para">
   Также это относится и к ключевому слову <a href="language.variables.scope.php#language.variables.scope.global" class="link"><code class="literal">global</code></a>. Для эмуляции старого
   поведения необходимо использовать фигурные скобки:
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">f</span><span style="color: #007700">() {<br />    </span><span style="color: #FF8000">// Корректно только в PHP 5.<br />    </span><span style="color: #007700">global $</span><span style="color: #0000BB">$foo</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bar</span><span style="color: #007700">;<br /><br />    </span><span style="color: #FF8000">// Корректно в PHP 5 и 7.<br />    </span><span style="color: #007700">global ${</span><span style="color: #0000BB">$foo</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">bar</span><span style="color: #007700">};<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.variable-handling.list">
  <h4 class="title">Изменение в обработке <span class="function"><a href="function.list.php" class="function">list()</a></span></h4>

  <div class="sect4" id="migration70.incompatible.variable-handling.list.order">
   <h5 class="title">
    <span class="function"><a href="function.list.php" class="function">list()</a></span> больше не присваивает переменные в обратном порядке
   </h5>

   <p class="para">
    Теперь <span class="function"><a href="function.list.php" class="function">list()</a></span> присваивает переменные в
    том порядке, как они перечислены, а не в обратном. В целом,
    это влияет только на случаи, когда <span class="function"><a href="function.list.php" class="function">list()</a></span>
    используется совместно с оператором массива
    <code class="code">[]</code>, как показано ниже:
   </p>

   <div class="informalexample">
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">list(</span><span style="color: #0000BB">$a</span><span style="color: #007700">[], </span><span style="color: #0000BB">$a</span><span style="color: #007700">[], </span><span style="color: #0000BB">$a</span><span style="color: #007700">[]) = [</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #0000BB">3</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    
<p class="para">
 Результат выполнения приведённого примера в PHP 5:
</p>

    <div class="example-contents screen">
<div class="cdata"><pre>
array(3) {
  [0]=&gt;
  int(3)
  [1]=&gt;
  int(2)
  [2]=&gt;
  int(1)
}
</pre></div>
    </div>
    
<p class="para">
 Результат выполнения приведённого примера в PHP 7:
</p>

    <div class="example-contents screen">
<div class="cdata"><pre>
array(3) {
  [0]=&gt;
  int(1)
  [1]=&gt;
  int(2)
  [2]=&gt;
  int(3)
}
</pre></div>
    </div>
   </div>

   <p class="para">
    Также хочется отметить, что полагаться на порядок
    присвоения оператором <span class="function"><a href="function.list.php" class="function">list()</a></span> - не самое
    разумное решение, поскольку он снова может поменяться
    в будущем.
   </p>
  </div>

  <div class="sect4" id="migration70.incompatible.variable-handling.list.empty">
   <h5 class="title">Пустое присвоение <span class="function"><a href="function.list.php" class="function">list()</a></span> больше не разрешено</h5>

   <p class="para">
    Конструкция <span class="function"><a href="function.list.php" class="function">list()</a></span> больше не может быть
    пустой. Следующие примеры недопустимы:
   </p>

   <div class="informalexample">
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">list() = </span><span style="color: #0000BB">$a</span><span style="color: #007700">;<br />list(,,) = </span><span style="color: #0000BB">$a</span><span style="color: #007700">;<br />list(</span><span style="color: #0000BB">$x</span><span style="color: #007700">, list(), </span><span style="color: #0000BB">$y</span><span style="color: #007700">) = </span><span style="color: #0000BB">$a</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </div>

  <div class="sect4" id="migration70.incompatible.variable-handling.list.string">
   <h5 class="title"><span class="function"><a href="function.list.php" class="function">list()</a></span> не может раскрывать строки</h5>

   <p class="para">
    <span class="function"><a href="function.list.php" class="function">list()</a></span> более не может раскрывать
    строки. Используйте <span class="function"><a href="function.str-split.php" class="function">str_split()</a></span>.
   </p>
  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.variable-handling.array-order">
  <h4 class="title">
   Изменён порядок массива при автоматическом создании через
   присвоение по ссылке
  </h4>

  <p class="para">
   Порядок создания элементов в массиве был изменён, когда
   элемент создаётся путём присвоения значения переменной,
   на которую ссылается этот элемент. Пример:
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$array </span><span style="color: #007700">= [];<br /></span><span style="color: #0000BB">$array</span><span style="color: #007700">[</span><span style="color: #DD0000">"a"</span><span style="color: #007700">] =&amp; </span><span style="color: #0000BB">$array</span><span style="color: #007700">[</span><span style="color: #DD0000">"b"</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">$array</span><span style="color: #007700">[</span><span style="color: #DD0000">"b"</span><span style="color: #007700">] = </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$array</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   
<p class="para">
 Результат выполнения приведённого примера в PHP 5:
</p>

   <div class="example-contents screen">
<div class="cdata"><pre>
array(2) {
  [&quot;b&quot;]=&gt;
  &amp;int(1)
  [&quot;a&quot;]=&gt;
  &amp;int(1)
}
</pre></div>
   </div>
   
<p class="para">
 Результат выполнения приведённого примера в PHP 7:
</p>

   <div class="example-contents screen">
<div class="cdata"><pre>
array(2) {
  [&quot;a&quot;]=&gt;
  &amp;int(1)
  [&quot;b&quot;]=&gt;
  &amp;int(1)
}
</pre></div>
   </div>
  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.variable-handling.parentheses">
  <h4 class="title">
   Скобки вокруг аргументов функции больше ни на что не влияют</h4>

  <p class="para">
   В PHP 5 при использовании избыточных скобок вокруг
   аргументов функции не выводилось предупреждение, когда
   аргумент передавался по ссылке. Теперь предупреждение
   выводится всегда.
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">getArray</span><span style="color: #007700">() {<br />    return [</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #0000BB">3</span><span style="color: #007700">];<br />}<br /><br />function </span><span style="color: #0000BB">squareArray</span><span style="color: #007700">(array &amp;</span><span style="color: #0000BB">$a</span><span style="color: #007700">) {<br />    foreach (</span><span style="color: #0000BB">$a </span><span style="color: #007700">as &amp;</span><span style="color: #0000BB">$v</span><span style="color: #007700">) {<br />        </span><span style="color: #0000BB">$v </span><span style="color: #007700">**= </span><span style="color: #0000BB">2</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #FF8000">// Выведет предупреждение в PHP 7.<br /></span><span style="color: #0000BB">squareArray</span><span style="color: #007700">((</span><span style="color: #0000BB">getArray</span><span style="color: #007700">()));<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   
<p class="para">
 Результат выполнения приведённого примера:
</p>

   <div class="example-contents screen">
<div class="cdata"><pre>
Notice: Only variables should be passed by reference in /tmp/test.php on line 13
</pre></div>
   </div>
  </div>
 </div>
</div>


 


<div class="sect2" id="migration70.incompatible.foreach">
 <h3 class="title">Изменения <a href="control-structures.foreach.php" class="link"><code class="literal">foreach</code></a></h3>

 <p class="para">
  Небольшие изменения были внесены в поведение
  управляющей структуры <a href="control-structures.foreach.php" class="link"><code class="literal">foreach</code></a>. Основное изменение
  касается модификации итерируемого массива и обработки его
  внутреннего указателя.
 </p>

 <div class="sect3" id="migration70.incompatible.foreach.array-pointer">
  <h4 class="title"><a href="control-structures.foreach.php" class="link"><code class="literal">foreach</code></a> больше не изменяет внутренний указатель массива</h4>

  <p class="para">
   До PHP 7 в процессе итерации массива в <a href="control-structures.foreach.php" class="link"><code class="literal">foreach</code></a>, его
   внутренний указатель изменялся. В примере ниже
   показано, что это поведение изменено:
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$array </span><span style="color: #007700">= [</span><span style="color: #0000BB">0</span><span style="color: #007700">, </span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">];<br />foreach (</span><span style="color: #0000BB">$array </span><span style="color: #007700">as &amp;</span><span style="color: #0000BB">$val</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">current</span><span style="color: #007700">(</span><span style="color: #0000BB">$array</span><span style="color: #007700">));<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   
<p class="para">
 Результат выполнения приведённого примера в PHP 5:
</p>

   <div class="example-contents screen">
<div class="cdata"><pre>
int(1)
int(2)
bool(false)
</pre></div>
   </div>
   
<p class="para">
 Результат выполнения приведённого примера в PHP 7:
</p>

   <div class="example-contents screen">
<div class="cdata"><pre>
int(0)
int(0)
int(0)
</pre></div>
   </div>
  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.foreach.by-value">
  <h4 class="title"><a href="control-structures.foreach.php" class="link"><code class="literal">foreach</code></a> по значениям оперирует копией массива</h4>

  <p class="para">
   Если <a href="control-structures.foreach.php" class="link"><code class="literal">foreach</code></a> используется для стандартного перебора
   по значению, то он оперирует копией массива, а не самим
   массивом. Это значит, что изменения внесённые в массив
   внутри цикла не затронут перебираемые значения.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.foreach.by-ref">
  <h4 class="title">Для <a href="control-structures.foreach.php" class="link"><code class="literal">foreach</code></a> по ссылке улучшили поведение при итерации</h4>

  <p class="para">
   Когда <a href="control-structures.foreach.php" class="link"><code class="literal">foreach</code></a> используется для перебора по ссылке,
   он будет лучше отслеживать изменения, вносимые в массив
   в процессе итерации. К примеру, добавление элементов к
   итерируемому массиву приведёт к тому, что эти новые
   элементы попадут в перебор:
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$array </span><span style="color: #007700">= [</span><span style="color: #0000BB">0</span><span style="color: #007700">];<br />foreach (</span><span style="color: #0000BB">$array </span><span style="color: #007700">as &amp;</span><span style="color: #0000BB">$val</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$val</span><span style="color: #007700">);<br />    </span><span style="color: #0000BB">$array</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">] = </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   
<p class="para">
 Результат выполнения приведённого примера в PHP 5:
</p>

   <div class="example-contents screen">
<div class="cdata"><pre>
int(0)
</pre></div>
   </div>
   
<p class="para">
 Результат выполнения приведённого примера в PHP 7:
</p>

   <div class="example-contents screen">
<div class="cdata"><pre>
int(0)
int(1)
</pre></div>
   </div>
  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.foreach.object">
  <h4 class="title">Итерация объектов  не реализующих <span class="classname"><a href="class.traversable.php" class="classname">Traversable</a></span></h4>

  <p class="para">
   Итерация объектов не реализующих
   <span class="classname"><a href="class.traversable.php" class="classname">Traversable</a></span> теперь происходит
   так же, как и итерация массива по ссылке. Так получается
   вследствие того, что
   <a href="migration70.incompatible.php#migration70.incompatible.foreach.by-ref" class="link">улучшения поведения при изменении массива во время итерации</a>
   также влияет при добавлении или удалении свойств объекта.
  </p>
 </div>
</div>


 


<div class="sect2" id="migration70.incompatible.integers">
 <h3 class="title">Изменение в обработке значений типа <span class="type"><a href="language.types.integer.php" class="type int">int</a></span></h3>

 <div class="sect3" id="migration70.incompatible.integers.invalid-octals">
  <h4 class="title">Некорректная восьмеричная нотация</h4>

  <p class="para">
   Ранее восьмеричные литералы, содержащие некорректные числа молча
   обрезались (<code class="literal">0128</code> считались за <code class="literal">012</code>).
   Сейчас в таких случаях будет выдана ошибка разбора.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.integers.negative-bitshift">
  <h4 class="title">Отрицательные побитовые смещения</h4>

  <p class="para">
   Теперь побитовые смещения на отрицательную величину будут
   бросать исключение <span class="classname"><a href="class.arithmeticerror.php" class="classname">ArithmeticError</a></span>:
  </p>
  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">1 </span><span style="color: #007700">&gt;&gt; -</span><span style="color: #0000BB">1</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   
<p class="para">
 Результат выполнения приведённого примера в PHP 5:
</p>

   <div class="example-contents screen">
<div class="cdata"><pre>
int(0)
</pre></div>
   </div>
   
<p class="para">
 Результат выполнения приведённого примера в PHP 7:
</p>

   <div class="example-contents screen">
<div class="cdata"><pre>
Fatal error: Uncaught ArithmeticError: Bit shift by negative number in /tmp/test.php:2
Stack trace:
#0 {main}
  thrown in /tmp/test.php on line 2
</pre></div>
   </div>
  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.integers.out-of-range">
  <h4 class="title">Побитовые смещения с выходом из допустимого диапазона</h4>

  <p class="para">
   Побитовые смещения (в обоих направлениях) за пределы ширины
   типа <span class="type"><a href="language.types.integer.php" class="type int">int</a></span> будут всегда возвращать 0.
   Раньше поведение зависело от архитектуры.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.integers.div-by-zero">
  <h4 class="title">Изменение в делении на ноль</h4>

  <p class="para">
   Ранее использование нуля в качестве делителя в операциях
   деления (/) или деления по модулю (%) приводило к ошибке уровня
   E_WARNING и возврату значения <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>.
   Теперь оператор деления возвращает число с плавающей точкой, равное
   +INF, -INF или NAN, как определено в IEEE 754. Деление по модулю вместо
   ошибки уровня E_WARNING будет выбрасывать исключение
   <span class="classname"><a href="class.divisionbyzeroerror.php" class="classname">DivisionByZeroError</a></span>.
  </p>
  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">3</span><span style="color: #007700">/</span><span style="color: #0000BB">0</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">0</span><span style="color: #007700">/</span><span style="color: #0000BB">0</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">0</span><span style="color: #007700">%</span><span style="color: #0000BB">0</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   
<p class="para">
 Результат выполнения приведённого примера в PHP 5:
</p>

   <div class="example-contents screen">
<div class="cdata"><pre>
Warning: Division by zero in %s on line %d
bool(false)

Warning: Division by zero in %s on line %d
bool(false)

Warning: Division by zero in %s on line %d
bool(false)
</pre></div>
   </div>
   
<p class="para">
 Результат выполнения приведённого примера в PHP 7:
</p>

   <div class="example-contents screen">
<div class="cdata"><pre>
Warning: Division by zero in %s on line %d
float(INF)

Warning: Division by zero in %s on line %d
float(NAN)

PHP Fatal error:  Uncaught DivisionByZeroError: Modulo by zero in %s line %d
</pre></div>
   </div>
  </div>
 </div>
</div>


 


<div class="sect2" id="migration70.incompatible.strings">
 <h3 class="title">Изменения в обработке строк</h3>

 <div class="sect3" id="migration70.incompatible.strings.hex">
  <h4 class="title">Шестнадцатеричные строки больше не считаются за числовые</h4>

  <p class="para">
   Строки, содержащие шестнадцатеричные символы больше не считаются за числовые.
   Пример:
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />var_dump</span><span style="color: #007700">(</span><span style="color: #DD0000">"0x123" </span><span style="color: #007700">== </span><span style="color: #DD0000">"291"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">is_numeric</span><span style="color: #007700">(</span><span style="color: #DD0000">"0x123"</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #DD0000">"0xe" </span><span style="color: #007700">+ </span><span style="color: #DD0000">"0x1"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">substr</span><span style="color: #007700">(</span><span style="color: #DD0000">"foo"</span><span style="color: #007700">, </span><span style="color: #DD0000">"0x1"</span><span style="color: #007700">));<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   
<p class="para">
 Результат выполнения приведённого примера в PHP 5:
</p>

   <div class="example-contents screen">
<div class="cdata"><pre>
bool(true)
bool(true)
int(15)
string(2) &quot;oo&quot;
</pre></div>
   </div>
   
<p class="para">
 Результат выполнения приведённого примера в PHP 7:
</p>

   <div class="example-contents screen">
<div class="cdata"><pre>
bool(false)
bool(false)
int(0)

Notice: A non well formed numeric value encountered in /tmp/test.php on line 5
string(3) &quot;foo&quot;
</pre></div>
   </div>
  </div>

  <p class="para">
   Используйте функцию <span class="function"><a href="function.filter-var.php" class="function">filter_var()</a></span> для проверки строки на
   содержание шестнадцатеричного числа и преобразования этой строки к
   значению типа <span class="type"><a href="language.types.integer.php" class="type int">int</a></span>:
  </p>

  <div class="informalexample">
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$str </span><span style="color: #007700">= </span><span style="color: #DD0000">"0xffff"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$int </span><span style="color: #007700">= </span><span style="color: #0000BB">filter_var</span><span style="color: #007700">(</span><span style="color: #0000BB">$str</span><span style="color: #007700">, </span><span style="color: #0000BB">FILTER_VALIDATE_INT</span><span style="color: #007700">, </span><span style="color: #0000BB">FILTER_FLAG_ALLOW_HEX</span><span style="color: #007700">);<br />if (</span><span style="color: #0000BB">false </span><span style="color: #007700">=== </span><span style="color: #0000BB">$int</span><span style="color: #007700">) {<br />    throw new </span><span style="color: #0000BB">Exception</span><span style="color: #007700">(</span><span style="color: #DD0000">"Некорректное целое число!"</span><span style="color: #007700">);<br />}<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$int</span><span style="color: #007700">); </span><span style="color: #FF8000">// int(65535)<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.strings.unicode-escapes">
  <h4 class="title"><code class="literal">\u{</code> может вызывать ошибки</h4>

  <p class="para">
   В связи с добавлением нового
   <a href="migration70.new-features.php#migration70.new-features.unicode-codepoint-escape-syntax" class="link">синтаксиса экранирования кодов Unicode</a>,
   строки, содержащие строку <code class="literal">\u{</code>, предваряющую некорректную
   последовательность, может привести к фатальной ошибке.
   Для того, чтобы этого избежать, необходимо экранировать первый обратный слеш.
  </p>
 </div>
</div>


 


<div class="sect2" id="migration70.incompatible.removed-functions">
 <h3 class="title">Удалённые функции</h3>

 <div class="sect3" id="migration70.incompatible.removed-functions.call-user-method">
  <h4 class="title">
   Функции <span class="function"><strong>call_user_method()</strong></span>
   и <span class="function"><strong>call_user_method_array()</strong></span>
  </h4>

  <p class="para">
   Эти функции устарели в PHP 4.1.0 в пользу
   функций <span class="function"><a href="function.call-user-func.php" class="function">call_user_func()</a></span>
   и <span class="function"><a href="function.call-user-func-array.php" class="function">call_user_func_array()</a></span>. Обратите внимание
   <a href="functions.variable-functions.php" class="link">на функции переменных</a>
   и (или) оператор
   <a href="functions.arguments.php#functions.variable-arg-list" class="link"><code class="literal">...</code></a>.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.removed-functions.ereg">
  <h4 class="title">
   Семейство функций ereg*
  </h4>
  <p class="para">
   Функции <code class="literal">ereg</code> удалили.
   Рекомендованная альтернатива — Perl-совместимые регулярные выражения <a href="book.pcre.php" class="link">PCRE</a>.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.removed-functions.mcrypt">
  <h4 class="title">Псевдонимы модуля <a href="book.mcrypt.php" class="link">mcrypt</a></h4>

  <p class="para">
   Устаревшую функцию <span class="function"><strong>mcrypt_generic_end()</strong></span> удалили в пользу
   функции <span class="function"><a href="function.mcrypt-generic-deinit.php" class="function">mcrypt_generic_deinit()</a></span>.
  </p>

  <p class="para">
   Кроме этого, устаревшие функции <span class="function"><strong>mcrypt_ecb()</strong></span>,
   <span class="function"><strong>mcrypt_cbc()</strong></span>, <span class="function"><strong>mcrypt_cfb()</strong></span>
   и <span class="function"><strong>mcrypt_ofb()</strong></span> удалили в пользу
   функции <span class="function"><a href="function.mcrypt-decrypt.php" class="function">mcrypt_decrypt()</a></span>
   с соответствующей константой
   <strong><code>MCRYPT_MODE_<span class="replaceable">*</span></code></strong>.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.removed-functions.mysql">
  <h4 class="title">
   Функции модуля mysql
  </h4>
  <p class="para">
   Все функции модуля <a href="book.mysql.php" class="link">ext/mysql</a> удалили.
   Подробнее о выборе другого API-интерфейса к СУБД MySQL рассказывает раздел
   «<a href="mysqlinfo.api.choosing.php" class="link">Выбор MySQL API</a>».
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.removed-functions.mssql">
  <h4 class="title">
   Функции модуля mssql
  </h4>
  <p class="para">
   Все функции модуля <code class="literal">ext/mssql</code> удалили.
   <ul class="simplelist">
    <li><a href="ref.pdo-sqlsrv.php" class="link">PDO_SQLSRV</a></li>
    <li><a href="ref.pdo-odbc.php" class="link">PDO_ODBC</a></li>
    <li><a href="book.sqlsrv.php" class="link">SQLSRV</a></li>
    <li><a href="book.uodbc.php" class="link">Unified ODBC API</a></li>
   </ul>
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.removed-functions.intl">
  <h4 class="title">Псевдонимы модуля <a href="book.intl.php" class="link">intl</a></h4>

  <p class="para">
   Устаревшие псевдонимы <span class="function"><strong>datefmt_set_timezone_id()</strong></span>
   и <span class="methodname"><strong>IntlDateFormatter::setTimeZoneID()</strong></span> удалили
   в пользу функции <span class="function"><a href="intldateformatter.settimezone.php" class="function">datefmt_set_timezone()</a></span>
   и метода <span class="methodname"><a href="intldateformatter.settimezone.php" class="methodname">IntlDateFormatter::setTimeZone()</a></span>.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.removed-functions.magic-quotes">
  <h4 class="title"><span class="function"><strong>set_magic_quotes_runtime()</strong></span></h4>

  <p class="para">
   Функцию <span class="function"><strong>set_magic_quotes_runtime()</strong></span> и её псевдоним
   <span class="function"><strong>magic_quotes_runtime()</strong></span> удалили. Функции объявили
   устаревшими в PHP 5.3.0, поскольку они потеряли смысл с отказом
   от магических кавычек в PHP 5.4.0.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.removed-functions.set-socket-blocking">
  <h4 class="title"><span class="function"><strong>set_socket_blocking()</strong></span></h4>

  <p class="para">
   Устаревший псевдоним <span class="function"><strong>set_socket_blocking()</strong></span> удалили
   в пользу функции <span class="function"><a href="function.stream-set-blocking.php" class="function">stream_set_blocking()</a></span>.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.removed-functions.dl">
  <h4 class="title">Функция <span class="function"><a href="function.dl.php" class="function">dl()</a></span> в менеджере процессов PHP-FPM</h4>

  <p class="para">
   Функцию <span class="function"><a href="function.dl.php" class="function">dl()</a></span> больше нельзя использовать в PHP-FPM.
   Однако функцию оставили в CLI-интерфейсе и встроенных интерфейсах SAPI.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.removed-functions.gd">
  <h4 class="title">Функции модуля <a href="book.image.php" class="link">GD</a> Type1</h4>

  <p class="para">
   Поддержку шрифтов PostScript Type1 удалили из модуля GD.
   Соответственно удалили следующие функции:
  </p>

  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara">
     <span class="function"><strong>imagepsbbox()</strong></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><strong>imagepsencodefont()</strong></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><strong>imagepsextendfont()</strong></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><strong>imagepsfreefont()</strong></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><strong>imagepsloadfont()</strong></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><strong>imagepsslantfont()</strong></span>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <span class="function"><strong>imagepstext()</strong></span>
    </span>
   </li>
  </ul>

  <p class="para">
   Вместо удалённых функций рекомендуется использовать шрифты TrueType и функции, которые с ними связаны.
  </p>
 </div>
</div>


 


<div class="sect2" id="migration70.incompatible.removed-ini-directives">
 <h3 class="title">Удалённые директивы INI-файла</h3>

 <div class="sect3" id="migration70.incompatible.removed-ini-directives.features">
  <h4 class="title">Удалённые возможности</h4>

  <p class="para">
   Следующие INI-директивы были удалены, так как связанные с ними функции
   также были удалены:
  </p>

  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara">
     <code class="parameter">always_populate_raw_post_data</code>
    </span>
   </li>
   <li class="listitem">
    <span class="simpara">
     <code class="parameter">asp_tags</code>
    </span>
   </li>
  </ul>
 </div>

 <div class="sect3" id="migration70.incompatible.removed-ini-directives.xsl">
  <h4 class="title"><code class="parameter">xsl.security_prefs</code></h4>

  <p class="para">
   Директива <code class="parameter">xsl.security_prefs</code> была удалена.
   Вместо неё для контроля настроек безопасности должен вызываться метод
   <span class="methodname"><a href="xsltprocessor.setsecurityprefs.php" class="methodname">XsltProcessor::setSecurityPrefs()</a></span>
   на уровне каждого процессора.
  </p>
 </div>
</div>


 


<div class="sect2" id="migration70.incompatible.other">
 <h3 class="title">Прочие изменения, которые затрагивают обратную совместимость</h3>

 <div class="sect3" id="migration70.incompatible.other.new-by-ref">
  <h4 class="title">Новые объекты нельзя присваивать по ссылке</h4>

  <p class="para">
   Результат оператора <a href="language.oop5.basic.php#language.oop5.basic.new" class="link"><code class="literal">new</code></a> больше нельзя присваивать
   переменной по ссылке:
  </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">C </span><span style="color: #007700">{}<br /></span><span style="color: #0000BB">$c </span><span style="color: #007700">=&amp; new </span><span style="color: #0000BB">C</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   
<p class="para">
 Результат выполнения приведённого примера в PHP 5:
</p>

   <div class="example-contents screen">
<div class="cdata"><pre>
Deprecated: Assigning the return value of new by reference is deprecated in /tmp/test.php on line 3
</pre></div>
   </div>
   
<p class="para">
 Результат выполнения приведённого примера в PHP 7:
</p>

   <div class="example-contents screen">
<div class="cdata"><pre>
Parse error: syntax error, unexpected &#039;new&#039; (T_NEW) in /tmp/test.php on line 3
</pre></div>
   </div>
  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.other.classes">
  <h4 class="title">Некорректные имена классов, интерфейсов и трейтов</h4>

  <p class="para">
   Следующие имена нельзя использовать для классов, интерфейсов и трейтов:
  </p>

  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara"><span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span></span>
   </li>
   <li class="listitem">
    <span class="simpara"><span class="type"><a href="language.types.integer.php" class="type int">int</a></span></span>
   </li>
   <li class="listitem">
    <span class="simpara"><span class="type"><a href="language.types.float.php" class="type float">float</a></span></span>
   </li>
   <li class="listitem">
    <span class="simpara"><span class="type"><a href="language.types.string.php" class="type string">string</a></span></span>
   </li>
   <li class="listitem">
    <span class="simpara"><strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong></span>
   </li>
   <li class="listitem">
    <span class="simpara"><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong></span>
   </li>
   <li class="listitem">
    <span class="simpara"><strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong></span>
   </li>
  </ul>

  <p class="para">
   Дополнительно к предыдущим именам, следующие имена тоже нельзя использовать.
   Следующие имена не вызовут ошибку в PHP 7.0, но их зарезервировали
   на будущее, а от разработчиков требуют считать их устаревшими.
  </p>

  <ul class="itemizedlist">
   <li class="listitem">
    <span class="simpara"><span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span></span>
   </li>
   <li class="listitem">
    <span class="simpara"><span class="type"><a href="language.types.object.php" class="type object">object</a></span></span>
   </li>
   <li class="listitem">
    <span class="simpara"><span class="type"><a href="language.types.mixed.php" class="type mixed">mixed</a></span></span>
   </li>
   <li class="listitem">
    <span class="simpara"><span class="type">numeric</span></span>
   </li>
  </ul>
 </div>

 <div class="sect3" id="migration70.incompatible.other.php-tags">
  <h4 class="title">Удалили PHP-теги ASP и script</h4>

  <p class="para">
   Удалили поддержку тегов ASP и script
   для определения PHP-кода.
  </p>

  <table class="doctable table">
   <caption><strong>Удалённые теги ASP и script</strong></caption>
   
    <thead>
     <tr>
      <th>Открывающий тег</th>
      <th>Закрывающий тег</th>
     </tr>

    </thead>

    <tbody class="tbody">
     <tr>
      <td><code class="code">&lt;%</code></td>
      <td><code class="code">%&gt;</code></td>
     </tr>

     <tr>
      <td><code class="code">&lt;%=</code></td>
      <td><code class="code">%&gt;</code></td>
     </tr>

     <tr>
      <td><code class="code">&lt;script language=&quot;php&quot;&gt;</code></td>
      <td><code class="code">&lt;/script&gt;</code></td>
     </tr>

    </tbody>
   
  </table>

 </div>

 <div class="sect3" id="migration70.incompatible.other.incompatible-this">
  <h4 class="title">Удалили вызовы из неподходящего контекста</h4>

  <p class="para">
   Статические вызовы нестатических методов из неподходящего
   контекста, <a href="migration56.deprecated.php#migration56.deprecated.incompatible-context" class="link">
    которые признали устаревшими в PHP 5.6
   </a>,
   теперь оставят переменную <code class="literal">$this</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">A<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">test</span><span style="color: #007700">()<br />    {<br />        </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$this</span><span style="color: #007700">);<br />    }<br />}<br /><br /></span><span style="color: #FF8000">// Обратите внимание: класс B не расширяет класс A<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">B<br /></span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">callNonStaticMethodOfA</span><span style="color: #007700">()<br />    {<br />        </span><span style="color: #0000BB">A</span><span style="color: #007700">::</span><span style="color: #0000BB">test</span><span style="color: #007700">();<br />    }<br />}<br /><br />(new </span><span style="color: #0000BB">B</span><span style="color: #007700">())<br />    -&gt;</span><span style="color: #0000BB">callNonStaticMethodOfA</span><span style="color: #007700">()<br />;<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   
<p class="para">
 Результат выполнения приведённого примера в PHP 5.6:
</p>

   <div class="example-contents screen">
<div class="cdata"><pre>
Deprecated: Non-static method A::test() should not be called statically, assuming $this from incompatible context in /tmp/test.php on line 8
object(B)#1 (0) {
}
</pre></div>
   </div>
   
<p class="para">
 Результат выполнения приведённого примера в PHP 7:
</p>

   <div class="example-contents screen">
<div class="cdata"><pre>
Deprecated: Non-static method A::test() should not be called statically in /tmp/test.php on line 8

Notice: Undefined variable: this in /tmp/test.php on line 3
NULL
</pre></div>
   </div>
  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.other.yield">
  <h4 class="title">Ключевое слово <a href="language.generators.syntax.php#control-structures.yield" class="link"><code class="literal">yield</code></a> теперь право-ассоциативный оператор</h4>

  <p class="para">
   Конструкция <a href="language.generators.syntax.php#control-structures.yield" class="link"><code class="literal">yield</code></a> больше не требует скобок
   и изменилась на право-ассоциативный оператор с приоритетом
   между языковой конструкцией <code class="literal">print</code> и оператором <code class="literal">=&gt;</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">echo yield -</span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /></span><span style="color: #FF8000">// Раньше интерпретировалось так<br /></span><span style="color: #007700">echo (yield) - </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /></span><span style="color: #FF8000">// А теперь так<br /></span><span style="color: #007700">echo yield (-</span><span style="color: #0000BB">1</span><span style="color: #007700">);<br /><br />yield </span><span style="color: #0000BB">$foo </span><span style="color: #007700">or die;<br /></span><span style="color: #FF8000">// Раньше интерпретировалось так<br /></span><span style="color: #007700">yield (</span><span style="color: #0000BB">$foo </span><span style="color: #007700">or die);<br /></span><span style="color: #FF8000">// А теперь так<br /></span><span style="color: #007700">(yield </span><span style="color: #0000BB">$foo</span><span style="color: #007700">) or die;<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>

  <p class="para">
   Устранять неоднозначности помогают скобки.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.other.func-parameters">
  <h4 class="title">В функциях нельзя определять параметры с одинаковыми именами</h4>

  <p class="para">
   Больше нельзя определить в функции параметры
   с одинаковыми именами. Следующая функция выдаст
   ошибку уровня <strong><code><a href="errorfunc.constants.php#constant.e-compile-error">E_COMPILE_ERROR</a></code></strong>:
  </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">function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">, </span><span style="color: #0000BB">$b</span><span style="color: #007700">, </span><span style="color: #0000BB">$unused</span><span style="color: #007700">, </span><span style="color: #0000BB">$unused</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">?&gt;</span></span></code></div>
   </div>

  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.other.func-parameter-modified">
  <h4 class="title">Функции, которые работают с аргументами, теперь возвращают
   <em>текущие</em> значения аргументов</h4>

  <p class="para">
   Функции <span class="function"><a href="function.func-get-arg.php" class="function">func_get_arg()</a></span>, <span class="function"><a href="function.func-get-args.php" class="function">func_get_args()</a></span>,
   <span class="function"><a href="function.debug-backtrace.php" class="function">debug_backtrace()</a></span> и трассировки исключений
   возвращают не исходные значения параметров, которые передали в функции в аргументах,
   а текущие значения параметров, которые к моменту возврата могли изменить значение.
  </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">function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">$x</span><span style="color: #007700">)<br />{<br />    </span><span style="color: #0000BB">$x</span><span style="color: #007700">++;<br />    </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">func_get_arg</span><span style="color: #007700">(</span><span style="color: #0000BB">0</span><span style="color: #007700">));<br />}<br /><br /></span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">1</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   
<p class="para">
 Результат выполнения приведённого примера в PHP 5:
</p>

   <div class="example-contents screen">
<div class="cdata"><pre>
1
</pre></div>
   </div>
   
<p class="para">
 Результат выполнения приведённого примера в PHP 7:
</p>

   <div class="example-contents screen">
<div class="cdata"><pre>
2
</pre></div>
   </div>
  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.other.multiple-default">
  <h4 class="title">Для оператора switch больше нельзя указывать больше одного блока default</h4>

  <p class="para">
   В операторе switch больше невозможно задать больше одного
   блока default. Например, такая конструкция выдаст
   ошибку <strong><code><a href="errorfunc.constants.php#constant.e-compile-error">E_COMPILE_ERROR</a></code></strong>:
  </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">switch (</span><span style="color: #0000BB">1</span><span style="color: #007700">) {<br />    default:<br />        break;<br />    default:<br />        break;<br />}<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </div>

 <div class="sect3" id="migration70.incompatible.other.http-raw-post-data">
  <h4 class="title">Удалили элемент суперглобального массива <var class="varname">$HTTP_RAW_POST_DATA</var></h4>

  <p class="para">
   Переменная <var class="varname">$HTTP_RAW_POST_DATA</var> больше недоступна. Вместо неё
   пользуются потоком <a href="wrappers.php.php#wrappers.php.input" class="link"><code class="literal">php://input</code></a>.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.other.ini-comments">
  <h4 class="title">
   В INI-файлах запретили комментарии,
   которые начинались с символа <code class="literal">#</code>
  </h4>

  <p class="para">
   Поддержку префикса комментария <code class="literal">#</code>
   в INI-файлах удалили. Вместо него пользуются префиксом <code class="literal">;</code>.
   Это изменение касается как файла <var class="filename">php.ini</var>, так и файлов,
   которые обрабатываются функциями
   <span class="function"><a href="function.parse-ini-file.php" class="function">parse_ini_file()</a></span>
   и <span class="function"><a href="function.parse-ini-string.php" class="function">parse_ini_string()</a></span>.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.other.json-to-jsond">
  <h4 class="title">Модуль JSON заменили на JSOND</h4>

  <p class="para">
   Модуль JSON заменили на JSOND, что порождает три
   небольших обратных несовместимости. Первое — числа
   нельзя заканчивать точкой, значения наподобие <code class="literal">34.</code>
   требуется заменить на <code class="literal">34.0</code> или <code class="literal">34</code>.
   Второе — в научной нотации экспоненте <code class="literal">e</code> нельзя следовать
   сразу за десятичной точкой, значения наподобие <code class="literal">3.e3</code>
   требуется заменить на <code class="literal">3.0e3</code> или <code class="literal">3e3</code>.
   Третье — модуль не считает пустую строку корректным JSON-форматом.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.other.internal-function-failure-overflow">
  <h4 class="title">Ошибки внутренних функций при переполнении</h4>

  <p class="para">
   Раньше встроенные функции иногда без предупреждения обрезали числа,
   которые получили при приведении значений с типом float к значениям с типом integer,
   если float-значение оказывалось больше, чем вмещает integer. Теперь функции
   выдадут ошибку уровня E_WARNING и вернут <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.other.fixes-custom-session-handler">
  <h4 class="title">Исправление для значений, которые возвращает пользовательский обработчик сессии</h4>

  <p class="para">
   Предикатные функции, которые реализовали через
   пользовательские обработчики сессии и которые возвращают
   значения <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> или <code class="literal">-1</code>, вызовут фатальную ошибку.
   Значения вызовут сбой и ошибку уровня E_WARNING, если из этих функций вернётся значение,
   которое отличается от логического, <code class="literal">-1</code> или <code class="literal">0</code>.
  </p>
 </div>

 <div class="sect3" id="migration70.incompatible.other.sort-order">
  <h4 class="title">Порядок сортировки одинаковых элементов</h4>
  <p class="para">
   Внутренний алгоритм сортировки улучшили. Изменение алгоритма
   иногда упорядочивает одинаковые элементы не так,
   как алгоритм делал это прежде.
  </p>
  <blockquote class="note"><p><strong class="note">Замечание</strong>: 
   <p class="para">
    Не полагайтесь на порядок одинаковых элементов, так как
    он изменится в любое время.
   </p>
  </p></blockquote>
 </div>

 <div class="sect3" id="migration70.incompatible.other.break-continue">
  <h4 class="title">Изменение порядка обработки операторов break и continue</h4>
  <p class="para">
   Операторы <code class="literal">break</code> и <code class="literal">continue</code> за пределами цикла
   или управляющей структуры <code class="literal">switch</code> теперь обрабатываются во время
   компиляции, а не во время выполнения, как это было раньше, поэтому выдают ошибки
   уровня <strong><code><a href="errorfunc.constants.php#constant.e-compile-error">E_COMPILE_ERROR</a></code></strong>.
  </p>
 </div>
 <div class="sect3" id="migration70.incompatible.other.break-continue-constant">
  <h4 class="title">Запретили константы как аргументы инструкций break и continue</h4>
  <p class="para">
   Инструкции <code class="literal">break</code> и <code class="literal">continue</code> больше
   не принимают константу как аргумент и вызывают ошибку
   уровня <strong><code><a href="errorfunc.constants.php#constant.e-compile-error">E_COMPILE_ERROR</a></code></strong>.
  </p>
 </div>


 <div class="sect3" id="migration70.incompatible.other.mhash">
  <h4 class="title">Mhash больше не модуль</h4>
  <p class="para">
   Модуль Mhash полностью интегрировали в модуль <a href="book.hash.php" class="link">Hash</a>. Поэтому больше невозможно определить
   доступность модуля Mhash функцией <span class="function"><a href="function.extension-loaded.php" class="function">extension_loaded()</a></span>;
   вместо неё пользуются функцией <span class="function"><a href="function.function-exists.php" class="function">function_exists()</a></span>.
   Кроме того, функция <span class="function"><a href="function.get-loaded-extensions.php" class="function">get_loaded_extensions()</a></span> и функции,
   которые с ней связаны, больше не сообщают о модуле Mhash.
  </p>
 </div>
 <div class="sect3" id="migration70.incompatible.other.declare-ticks">
  <h4 class="title">declare(ticks)</h4>
  <p class="para">
   Директива <a href="control-structures.declare.php#control-structures.declare.ticks" class="link">declare(ticks)</a>
   больше не проникает в отдельные единицы компиляции.
  </p>
 </div>
</div>


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