PHP. Версии. Новые возможности

  • PHP 5.3 Основные новшества: замыкания, лямбда-функции, пространства имён и позднее статическое связывание.
  • PHP 5.4 В нём были представлены типажи (трейты), возможность объявления массива с коротким синтаксисом [] (например, ['шит-цу', 'ротвейлер']). Ко всему прочему, в этой версии была убрана опция register_globals.
  • PHP 5.5 В этой версии появились генераторы (и связанное с ними ключевое слово yield), в инструкцию try/catch добавлен блок finally, на замену APC Cache пришел включённый по умолчанию OpCache (базируется на Zend Optimizer). Также был расширен синтаксис литералов массивов (['шит-цу', 'ротвейлер'][1] вернёт 'ротвейлер'), и добавлена удобная возможность обращения к символам в строке как к элементам массива (например, '6e5d4'[0] вернёт «6»).
  • PHP 5.6 Новый синтаксис для функций с переменным числом аргументов и радостный отход в историю мороки с func_get_args(): function fn($reqParam, $optParam = null, ...$params) { }. Импорт функций из пространства имён:
    use function foo\bar\baz;
    baz();

    Поддержка загрузки файлов больше 2 Гб. Был добавлен магический метод __debugInfo() для того, чтобы объект мог поменять значения свойств, выводимых при использовании var_dump().

  • PHP 7.0
  • PHP 7.1
  • PHP 7.2
  • PHP 7.3

PHP 5.3

Была выпущена в июне 2009 года, но до сих пор широко распространена. Основные новшества: замыкания, лямбда-функции, пространства имён и позднее статическое связывание.

  • Добавлена поддержка пространств имен.
  • Добавлена поддержка позднего статического связывания.
  • Добавлена поддержка меток перехода (ограниченный goto).
  • Добавлена поддержка нативных замыканий (closures) (анонимные/лямбда-функции).
  • Появились два магических метода: callStatic() и invoke().
  • Появилась поддержка синтаксиса Nowdoc, подобный Heredoc, но с одинарными кавычками.
  • Теперь возможно использовать Heredoc для инициализации статических переменных и свойств/констант классов.
  • Heredoc теперь может быть объявлен, используя двойные кавычки, дополняющие синтаксис Nowdoc.
  • Константы теперь могут быть объявлены вне класса, используя ключевое слово const.
  • У тернарного оператора есть теперь сокращенный вид: ?:.
  • Обертка (wrapper) HTTP-потока стала воспринимать коды статуса от 200 до 399 как успешные.
  • Стал возможен динамический доступ к статическим методам:
class C {
   public static $foo = 123;
}

$prop = 'foo';
$a = "C";

echo $a::$$prop;
  • Исключения теперь могут быть вложенными
  • Добавлен сборщик мусора для циклических ссылок. Он включен по умолчанию.
  • Функция mail() теперь поддерживает журналирование отправки письма с помощью директивы mail.log

Больше информации: http://php.net/manual/ru/migration53.new-features.php

PHP 5.4

Cостоялся в марте 2012 года. В нём были представлены типажи (трейты), возможность объявления массива с коротким синтаксисом [] (например, ['шит-цу', 'ротвейлер']). Ко всему прочему, в этой версии была убрана опция register_globals.

  • Добавлена поддержка трейтов.
  • Добавлен короткий синтаксис объявления массивов. Например, $a = [1, 2, 3, 4]; или $a = ['one' => 1, 'two' => 2, 'three' => 3, 'four' => 4];.
  • Добавлена возможность разыменования массивов, возвращаемых функциями. Например: foo()[0].
  • Классы для создания анонимных функций (Closures) теперь поддерживают $this.
  • Оператор <?= теперь доступен всегда, несмотря на значение php.ini опции _short_opentag.
  • Добавлена возможность получения доступа к члену класса при создании экземпляра. Например: (new Foo)->bar().
  • Теперь поддерживается такой синтаксис: Class::{expr}().
  • Добавлен бинарный формат задания чисел, например: 0b001001101.
  • Улучшены сообщения об ошибках разбора и предупреждения о несовместимых аргументах.
  • Расширение по работе с сессиями теперь может отслеживать процесс загрузки файлов.
  • Встроенный веб-сервер в режиме командной строки для разработчиков.
  • Расширение GD теперь поддерживает чтение и запись изображений WebP

Больше информации: http://php.net/manual/ru/migration54.new-features.php

PHP 5.5

Был выпущен в июне 2013 года, и это текущий релиз. В этой версии появились генераторы (и связанное с ними ключевое слово yield), в инструкцию try/catch добавлен блок finally, на замену APC Cache пришел включённый по умолчанию OpCache (базируется на Zend Optimizer). Также был расширен синтаксис литералов массивов (['шит-цу', 'ротвейлер'][1] вернёт 'ротвейлер'), и добавлена удобная возможность обращения к символам в строке как к элементам массива (например, '6e5d4'[0] вернёт «6»).

  • Добавлены генераторы
  • Добавлено ключевое слово finally
  • Новое API хеширования паролей
  • foreach теперь поддерживает list()
  • empty() поддерживает произвольные выражения
  • Литералы array и string разыменовываются
  • Разрешение имен класса с помощью ::class
  • Добавлено расширение OPcache
  • foreach теперь поддерживает нескалярные ключи
  • Поддержка обработчика Apache 2.4 под Windows
  • Улучшения в GD

Больше информации: http://php.net/manual/ru/migration55.new-features.php

PHP 5.6

Новый синтаксис для функций с переменным числом аргументов и радостный отход в историю мороки с func_get_args():

function fn($reqParam, $optParam = null, ...$params) { }

Импорт функций из пространства имён:

use function foo\bar\baz;
baz();

Поддержка загрузки файлов больше 2 Гб Был добавлен магический метод __debugInfo() для того, чтобы объект мог поменять значения свойств, выводимых при использовании var_dump().

  • Константные выражения
  • Функции с переменным количеством аргументов, используя синтаксис ...
  • Распаковка аргументов с помощью ...
  • Возведение в степень с помощью **
  • use function и use const
  • phpdbg
  • Кодировка по умолчанию UTF-8 в php.ini
  • Переиспользование php://input
  • Загрузка больших файлов (> 2Gb)
  • GMP поддерживает перезагрузку операторов
  • hash_equals() для предотвращение атак по времени при сравнении строк
  • __debugInfo()
  • Алгоритм хеширования gost-crypto
  • Улучшение SSL/TLS

Больше информации: https://www.php.net/manual/ru/migration56.new-features.php

PHP 7

Одним из самых значительных событий, произошедших в мире PHP в 2015 году, стал выпуск PHP 7. Практически все обновления привносили небольшие улучшения производительности. Однако на этот раз производительность PHP, по сравнению с более ранними версиями, выросла куда более существенно, став одной из наиболее привлекательных особенностей PHP 7.

  • Объявления скалярных типов
  • Объявления возвращаемых значений
  • Оператор объединения с null (Оператор: ??)
  • Оператор spaceship (космический корабль) Пример: 2 <=> 1; // 1
  • Определение констант массивов с помощью define()
  • Анонимные классы
  • Групповые объявления use
  • Выражение return в генераторах
  • Делегация генератора
  • Синтаксис кодирования Unicode
  • Closure::call()
  • unserialize() с фильтрацией
  • IntlChar
  • Ожидания
  • Функция целочисленного деления intdiv()
  • Опции сессий
  • Функции CSPRNG
  • Теперь функция list() всегда может распаковывать объекты, реализующие ArrayAccess

Примеры:

Группировка объявлений импорта:

use Framework\Module\{Foo, Bar, Baz};

Null-коалесцентный оператор

$bar = $foo ?? 'default';

Оператор “космический корабль”

switch ($bar <=> $foo) {
    case 0:
        echo '$bar и $foo равны';
    case -1:
        echo '$foo больше';
    case 1:
        echo '$bar больше';
}

Определение константных массивов define()

<?php

define('ANIMALS', [
  'dog',
  'cat',
  'bird'
]);

echo ANIMALS[1]; //вывод: "cat"

Типы скалярных параметров и подсказки (hints) по возвращаемым типам

class Calculator
{
// объявляем, что параметры имеют целый тип integer
    public function addTwoInts(int $x, int $y): int {
// явно объявляем, что метод возвращает целое
        return $x + $y;
    }
}
Анонимные классы
<?php

interface Logger {
  public function log(string $msg);
}

class Application {

  private $logger;

  public function getLogger(): Logger {
    return $this->logger; }
  public function setLogger(Logger $logger) {
    $this->logger = $logger;
  }
}

$app = new Application;
$app->setLogger(new class implements Logger {
  public function log(string $msg) {
    echo $msg;
  }
});

var_dump($app->getLogger());

Синтаксис Escape-кода для Unicode
echo "\u{1F602}"; // выводит смайлик

Обновленные генераторы
function genA() {
    yield 2;
    yield 3;
    yield 4;
}

function genB() {
    yield 1;
    yield from genA(); // 'genA' вызывается и отрабатывает в этом месте
    yield 5;
    return 'success'; // финальный результат, который мы позже можем проверить
}

foreach (genB() as $val) {
    echo "\n $val"; // выдаст значения от 1 до 5
}

$genB()->getReturn(); // вернет 'success' при отсутствии ошибок

До PHP 7 такой код привел бы к фатальной ошибке исполнения скрипта:
try {
    thisFunctionDoesNotEvenExist(); //ЭтаФункцияДажеНеСуществует()
} catch (\EngineException $e) {
    // Подчищаем за собой и записываем информацию об ошибке в лог
    echo $e->getMessage();
}

PHP 7.1

  • Обнуляемые типы. Преимер function test(?string $name) ?string
  • Ничего не возвращающие функции Пример function test(...$parms): void
  • Симметричная деструктуризация массива
  • Видимость констант класса
  • Псевдотип iterable
  • Обработка нескольких исключений в одном блоке catch
  • Поддержка ключей в list()
  • Поддержка отрицательных смещений для строк
  • Поддержка AEAD в ext/openssl
  • Асинхронная обработка сигналов
  • Поддержка HTTP/2 server push в ext/curl

http://php.net/manual/ru/migration71.new-features.php

Добавлен возвращаемый тип «void» (RFC)

function someNethod(): void {
    // работает если return отсутсвует
    // работает с return;
    // не работает если return null;
    // не работает если return 123;
}

Добавлен новый псевдо-тип: «iterable» (RFC)

function walkList(iterable $list): iterable {
    foreach ($list as $value) {
        yield $value[‘id’];
    }
}

Этот тип по сути объединяет примитивный тип array и интерфейс Traversable (а значит и его производные: Iterator, Generator, etc). Проблема возникла на почве того, что к примеру, foreach может работать с обоими типами, но функция с типом array не примет объект с интерфейсом Traversable и наоборот

Появилась возможность разрешать null в типизированных и возвращаемых параметрах (Nullable RFC)

    function callMethod(?Bar $bar): ?Bar {}
    $this->callMethod($bar); // Работает
    $this->callMethod(null);   // Работает
    $this->callMethod();        // НЕ работает

Добавлена возможность использовать отрицательное значение для смещения в строках (RFC)

echo $msg[-1]; // вернет последний символ
echo $msg{-3}; // Причем RFC явно рекомендует использовать способ $str{} так как $str[] может сбивать с толку И в будущем может быть объявлен как устаревшим.

Разрешено использовать строковые ключи в конструкции list() (RFC)

Так же был добавлен короткий синтаксис для list (RFC).

["test" => $a, "name" => $b] = ["name" => "Hello", "test" => "World!"];
var_dump($a); // World!
var_dump($b); // Hello

Поддержка модификаторов видимости для констант класса (RFC)

class Token {
    // Константа без модификатора по умолчанию “public”
    const PUBLIC_CONST = 0;

        // Константы с различной областью видимости
        private const PRIVATE_CONST = 0;
        protected const PROTECTED_CONST = 0;
        public const PUBLIC_CONST_TWO = 0;

        // Весь список имеет одну область видимости
        private const FOO = 1, BAR = 2;
}

Обработка нескольких исключений в одном блоке catch

try {
   echo "OK";
} catch (Exception | DomainException $e) {
   // ... обработка 2ух типов исключений сразу
} catch (TypeError $e) {
   // ...
}

PHP 7.2

  • Новый тип object Пример: function test(object $obj) : object
  • Загрузка расширения по имени
  • Разрешена перегрузка абстрактных методов
  • Sodium теперь является основным расширением (криптографическая библиотека Sodium теперь стала основным расширением в PHP)
  • Добавлено хеширование пароля с помощью Argon2
  • Расширенные типы строк для PDO
  • Дополнительная отладочная информация при эмуляции подготавливаемых запросов в PDO
  • Поддержка расширенных операций в LDAP
  • Информация об адресе в расширение сокетов
  • Улучшения в расширении EXIF

Добавлена возможность перегружать абстрактные функции

abstract class A  {
    abstract function bar(stdClass $x);
}
abstract class B extends A {
    abstract function bar($x): stdClass;
}
class C extends B {
    function bar($x): stdClass {
      // Code ...
    }
}

PHP 7.3

Синтаксис

  • Смягчение требований к синтаксису Heredoc и Nowdoc
  • Поддержка конечных запятых в вызовах функций и методов
  • Ссылки в list()

Устаревшие возможности (deprecated)

  • Функция image2wbmp() объявлена устаревшей
  • Флаги FILTER_FLAG_SCHEME_REQUIRED и FILTER_FLAG_HOST_REQUIRED при использовании FILTER_VALIDATE_URL объявлены устаревшими
  • Регистро-независимые константы объявлены устаревшими

Новые возможности

  • Опциональный выброс исключений при ошибках в функциях json_encode и json_decode
  • Добавление функции is_countable()
  • Добавление функций array_key_first() и array_key_last()
  • Деструктурирование массива поддерживает присвоение по ссылкам
2019-03-30 18:18:38