- PVSM.RU - https://www.pvsm.ru -
Новая версия PHP хоть и является минорной, но уже несёт множество новых, без преувеличения, крутых возможностей как для синтаксиса языка, так и для его производительности. Список новшеств не окончательный, но основные изменения уже внесены и приняты. Релиз планируется на декабрь 2019 года.

Ключевые изменения грядущей версии:
Подробнее об этих и других изменениях читайте под катом.
Disclaimer: Уже несколько раз в моих обсуждениях с коллегами фигурировала статья Брента «New in PHP 7.4 [1]». Сначала я хотел сделать перевод, но в процессе понял, что в тексте указаны не все последние обновления и присутствуют некоторые неточности, поэтому вместо перевода появилась эта статья.
Стрелочные функции позволяют делать более короткую запись анонимных функций:
array_map(function (User $user) {
return $user->id;
}, $users)
array_map(fn(User $user) => $user->id, $users)
Некоторые особенности принятой реализации стрелочных функций:
parent области, таким образом, нет необходимости использовать ключевое слово use.$this тоже доступна, как и в обычных анонимных функциях.Подробнее вы можете прочитать о них в этой статье [3] на Хабре.
Ура! Свойства класса теперь смогут иметь type hint. Это очень долгожданное со времён PHP 7 изменение в направлении более строгой типизации языка. Теперь у нас есть все основные возможности для строгой типизации. Для типизации доступны все типы, за исключением void и callable.
class Bar
{
public string $name;
public ?int $amount;
public Foo $foo;
}
Если хотите чтобы я более подробно рассмотрел новые возможности типизации свойств объектов, отметьтесь в комментариях, и я напишу отдельную статью про них!
Вместо такой длинной записи:
$data['date'] = $data['date'] ?? new DateTime();
Теперь можно будет написать так:
$data['date'] ??= new DateTime();
Теперь можно использовать оператор распаковки в массивах:
$arrayA = [1, 2, 3];
$arrayB = [4, 5];
$result = [0, ...$arrayA, ...$arrayB, 6 ,7];
<i>// [0, 1, 2, 3, 4, 5, 6, 7]</i>
Обратите внимание, что это работает только с неассоциативными массивами.
Интерфейс внешних функций (FFI) позволяет писать код на C непосредственно в PHP-коде. Это означает, что расширения PHP могут быть написаны на чистом PHP.
Следует отметить, что это сложная тема. Вам всё ещё нужно знание C, чтобы правильно использовать эти возможности.
Предварительная загрузка — потрясающее дополнение к ядру PHP, которое должно привести к некоторым значительным улучшениям производительности.
Например, если вы используете фреймворк, его файлы должны быть загружены и перекомпилированы по каждому запросу. При использовании opcache — при первом участии этих файлов в процессе обработки запроса и далее при каждом успешной проверке на их изменения. Предварительная загрузка позволяет серверу загружать указанные PHP-файлы в память при запуске и иметь их постоянно доступными для всех последующих запросов, без осуществления дополнительных проверок на изменения файлов.
Повышение производительности происходит «небесплатно» — если предварительно загруженные файлы изменяются, сервер должен быть перезапущен.
В настоящее время PHP имеет в основном инвариантные типы параметров и инвариантные возвращаемые типы. Данное изменение позволяет изменять тип параметра на один из его супертипов. В свою очередь возвращаемый тип можно заменить на его подтип. Таким образом, данное изменение позволит более строго следовать принципу подстановки Барбары Лисков.
Пример использования ковариантного возвращаемого типа:
interface Factory {
function make(): object;
}
class UserFactory implements Factory {
function make(): User;
}
и контравариантного аргумента:
interface Concatable {
function concat(Iterator $input);
}
class Collection implements Concatable {
function concat(iterable $input) {/* . . . */}
}
Становятся доступными два новых магических метода: __serialize и __unserialize. Данный механизм сериализации объединяет универсальность интерфейса Serializable с подходом реализации __sleep/__wakeup методов. Более подробно с их различиями можно ознакомиться в RFC.
Если бы вы написали что-нибудь подобное:
echo "sum: " . $a + $b;
Сейчас PHP интерпретировал бы это как:
echo ("sum: " . $a) + $b;
PHP 8 будет интерпретировать это иначе:
echo "sum :" . ($a + $b);
PHP 7.4 добавляет предупреждение об устаревании при обнаружении выражения, содержащего "." перед "+ " или "-" и неокружённого при этом скобками.
__toString (RFC [12])
Ранее исключения не могли быть выброшены из магического метода __toString. Обоснованием этого поведения является то, что преобразования объектов к строкам выполняются во многих функциях стандартной библиотеки, и не все они готовы «правильно» обрабатывать исключения. В рамках этого RFC был выполнен всесторонний аудит строковых преобразований в кодовой базе, и данное ограничение теперь можно снять, что и было сделано.
Библиотеки, такие как symfony/var-dumper, для точного вывода переменных сильно полагаются на ReflectionAPI. Раньше не было надлежащей поддержки рефлексии ссылок, что заставляло эти библиотеки полагаться на хаки для обнаружения ссылок. PHP 7.4 добавляет класс ReflectionReference, который решает эту проблему.
mb_str_split (RFC [14])
Эта функция обеспечивает ту же функциональность, что и str_split, но для строк, записанных в многобайтовых кодировках.
ext-hash (RFC [15])Это расширение теперь постоянно доступно во всех установках PHP.
PEAR больше не поддерживается активно, core-команда решила удалить его из установки по умолчанию с PHP 7.4.
Добавлена новая функция password_algos, которая возвращает список всех зарегистрированных алгоритмов хеширования паролей.
Слабые ссылки позволяют сохранить ссылку на объект, которая не препятствует уничтожению этого объекта. Например, они полезны для реализации кэш-подобных структур.
Отсутствие визуальных разделителей в группах цифр увеличивало время чтения и отладки кода, и могло привести к непреднамеренным ошибкам. Теперь добавлена поддержка символа подчёркивания в числовых литералах для визуального разделения групп цифр.
1_000_000_000 // int
6.674_083e-11; // float
299_792_458; // decimal
0xCAFE_F00D; // hexadecimal
0b0101_1111; // binary
0137_041; // octal
Короткий открывающий тег <? устарел и будет удалён в PHP 8. Короткий тег <?= (echo) не пострадал.
Тернарный оператор имеет некоторые странные причуды в PHP. Этот RFC объявляет устаревшими вложенные тернарные операторы.
1 ? 2 : 3 ? 4 : 5; // deprecated
(1 ? 2 : 3) ? 4 : 5; // ok
В PHP 8 такая запись приведёт к ошибке уровня компиляции.
Вот некоторые из самых важных на данный момент обратно несовместимых изменений:
parent:: в классе не имеющем родителя объявлен устаревшим.var_dump на экземпляре DateTime или DateTimeImmutable больше не делает доступными свойства объекта.openssl_random_pseudo_bytes выдаст исключение в ошибочных ситуациях, вызванных библиотекой OpenSSL. Раньше она возвращала false, что могло привести к генерации пустой строки.PDO или экземпляр PDOStatement генерирует Exception вместо PDOException.get_object_vars() на экземпляре ArrayObject возвратит свойства самого ArrayObject, а не значения обёрнутого массива. Чтобы как раньше получить значения обернутого массива — приведите ArrayObject к типу array.Автор: Oleg Zolotarev
Источник [23]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/319926
Ссылки в тексте:
[1] New in PHP 7.4: https://stitcher.io/blog/new-in-php-74
[2] RFC: https://wiki.php.net/rfc/arrow_functions_v2
[3] статье: https://habr.com/ru/post/450544/
[4] RFC: https://wiki.php.net/rfc/typed_properties_v2
[5] RFC: https://wiki.php.net/rfc/null_coalesce_equal_operator
[6] RFC: https://wiki.php.net/rfc/scodead_operator_for_array
[7] RFC: https://wiki.php.net/rfc/ffi
[8] RFC: https://wiki.php.net/rfc/codeload
[9] RFC: https://wiki.php.net/rfc/covariant-returns-and-contravariant-parameters
[10] RFC: https://wiki.php.net/rfc/custom_object_serialization
[11] RFC: https://wiki.php.net/rfc/concatenation_codecedence
[12] RFC: https://wiki.php.net/rfc/tostring_exceptions
[13] RFC: https://wiki.php.net/rfc/reference_reflection
[14] RFC: https://wiki.php.net/rfc/mb_str_split
[15] RFC: https://wiki.php.net/rfc/permanent_hash_ext
[16] EXTERNALS: https://externals.io/message/103977
[17] RFC: https://wiki.php.net/rfc/password_registry
[18] RFC: https://wiki.php.net/rfc/weakrefs
[19] RFC: https://wiki.php.net/rfc/numeric_literal_separator
[20] RFC: https://wiki.php.net/rfc/decodecate_php_short_tags
[21] RFC: https://wiki.php.net/rfc/ternary_associativity
[22] UPGRADING: https://github.com/php/php-src/blob/PHP-7.4/UPGRADING
[23] Источник: https://habr.com/ru/post/454410/?utm_source=habrahabr&utm_medium=rss&utm_campaign=454410
Нажмите здесь для печати.