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()
- Деструктурирование массива поддерживает присвоение по ссылкам