1. Главная страница » Компьютеры » Php 7 что нового

Php 7 что нового

Автор: | 16.12.2019

Содержание

PHP 7.4 — последняя версия перед PHP 8, содержит множество дополнений и исправлений синтаксиса, будет выпущен 28 ноября 2019 года. Пост создан для помощи в подготовки к предстоящим изменениям.

PHP 7.4 будет содержать немало новых возможностей, начнем с новых функций, а затем рассмотрим изменения и устаревание функционала.

Короткие замыкания RFC

Короткие замыкания допускают менее подробный синтаксис анонимной функции. Вместо многословного:

можно использовать более лаконичное выражение:

Согласитесь, выглядит здорово?!

  • Короткие замыкания могут получить доступ к родительской области, ключевое слово use — не нужно.
  • $this доступен так же, как и у обычных замыканий.
  • Такие замыкания могут содержать в теле только одну строку, которая также является оператором возврата.

Предварительная загрузка (Preloading) RFC

Предварительная загрузка — удивительное дополнение к ядру PHP, которое может привести к значительному улучшению производительности.

Итак, если вы в своей работе используете какой-либо фреймворк, его файлы должны быть загружены и перекомпилированы при каждом запросе. Предварительная загрузка позволяет серверу загружать PHP-файлы в память при запуске и иметь их постоянно доступными для всех последующих запросов.

Предварительная загрузка управляется директивой opcache.preload в файле php.ini . Эта директива указывает PHP-скрипт, который будет скомпилирован и выполнен при запуске сервера. Данный файл может использоваться для предварительной загрузки дополнительных файлов или через функцию opcache_compile_file() (подробнее см. Документацию PHP).

Повышение производительности, конечно, связано с некоторым условием: если источник предварительно загруженных файлов изменяется, сервер должен быть перезапущен.

Типизированные свойства RFC

Переменные класса могут быть подсказаны типом:

Это очень долгожданное со времён PHP 7 изменение в направлении более строгой типизации языка. Теперь у нас есть все основные возможности для строгой типизации.Для типизации доступны все типы, за исключением void и callable.

Улучшена разница типов RFC

Разница типов — это тема, достойная отдельного сообщения в блоге ; короче говоря: вы сможете использовать противоречивые типы возврата

. и противоречивые аргументы.

RFC в настоящее время находится на этапе голосования, но, похоже, пройдет без проблем

Интерфейс внешней функции RFC

Интерфейс внешней функции, FFI, позволяет вызывать код C из пользовательского пространства. Это означает, что расширения PHP могут быть написаны на чистом PHP.

Следует отметить, что это сложная тема. Вам все еще нужны знания C, чтобы правильно использовать эту функцию.

Оператор присваивания значения NULL RFC

Появится возможность использовать синтаксис "если левый параметр не существует или равен null, присвоить ему значение правого параметра".

Т.е. вместо этого:

Вы можете сделать это:

Оператор распаковки (. ) в массивах RFC

Теперь можно использовать оператор распаковки в массивах:

Это работает только с массивами с числовыми ключами, с ассоциативными массивами распаковка работать не будет, ошибка будет выдана при обнаружении строкового ключа. Оператор спреда должен иметь лучшую производительность, чем array_merge. Это объясняется не только тем, что оператор распаковки является языковой структурой, в то время как array_merge является функцией, но и оптимизация времени компиляции может быть выполнена для констант массива. Плюс array_merge поддерживает операции только над массивами, а оператор спреда поддерживает реализацию объектов Traversable.

Пользовательская сериализация объектов RFC

В настоящее время PHP предоставляет два механизма для настраиваемой сериализации объектов: методы __sleep()/__wakeup() и Serializable интерфейс. К сожалению, по словам Никиты, оба подхода имеют проблемы., которые приводят к сложному и ненадежному коду Этот RFC добавляет два новых магических метода: __serialize и __unserialize, которые позволяют избежать этих проблем

Использование очень похоже на Serializable интерфейс. С практической точки зрения главное отличие состоит в том, что вместо вызова serialize() внутри Serializable::serialize() вы напрямую возвращаете данные, которые должны быть сериализованы в виде массива. В следующем примере показано, как __serialize()/__unserialize() используются и как они составляются при наследовании:

Разделитель числовых литералов RFC

Отсутствие визуальных разделителей в группах цифр увеличивало время чтения и отладки кода, и могло привести к непреднамеренным ошибкам. Теперь добавлена поддержка символа подчёркивания в числовых литералах для визуального разделения групп цифр.

Рефлексия для ссылок RFC

Такие библиотеки как var dumper Symfony, в значительной степени полагаются на API Рефлексии для надежного вывода переменной. Раньше не было должной поддержки рефлексии для ссылок, в результате чего эти библиотеки полагались на "хаки" для обнаружения ссылок.

PHP 7.4 добавляет класс ReflectionReference, который решает эту проблему.

Обновление 02-14: RFC пройден, и изменения подтверждены для PHP 7.4.

Слабые ссылки

Слабые ссылки — это ссылки на объекты, которые не мешают их уничтожению. PHP 7.4 вводит класс WeakReference , который позволяет программистам сохранять ссылку на объект, который не препятствует уничтожению самого объекта. В настоящее время PHP поддерживает Weak References, используя расширение вроде pecl-weakref . В любом случае, новый API отличается от документированного WeakRefкласса.

Вот пример от автора этого предложения, Никиты Попова:

Сначала var_dump выведет object(std >NULL , так как указанный объект был уничтожен.

Добавлена функция mb_str_split RFC

Эта функция обеспечивает те же функциональные возможности, что str_split и для многобайтовых строк.

Реестр хэширования паролей RFC

Внутренние изменения в библиотеке хеширования, чтобы пользователям было проще использовать хэширование. Добавлена новая функция password_algos, которая возвращает список всех зарегистрированных алгоритмов хеширования паролей

Изменения и устаревание

Помимо новых функций, есть также много изменений в языке. Большинство этих изменений не нарушают работу программиста, хотя некоторые из них могут повлиять на уже написанный вами код.

Обратите внимание, что предупреждения об устаревании не являются критическими, а просто уведомляют разработчика о том, что функциональность будет удалена или изменена в будущем. Было бы хорошо не игнорировать предупреждения об устаревании и сразу же их исправлять; поскольку это сделает путь обновления для PHP 8.0 более простым.

Если бы вы написали что-то вроде этого:

Читайте также:  Epson stylus cx4900 отзывы

PHP ранее интерпретировал бы это так:

PHP 8 сделает так, чтобы он интерпретировался так:

В PHP 7.4 при обнаружении выражения без скобок, добавлено предупреждение об устаревании синтаксиса, содержащего «.» перед «+» или «-».

Разрешены исключения в __toString RFC

Ранее исключения не могли быть добавлены в магический метод__toString. Они были запрещены из-за некоторых старых механизмов обработки ошибок, правда Никита Попов отметил, что это «решение» на самом деле не решило проблему, которую он пытался решить.

RFC все еще находится на стадии голосования, но с 32 голосами за и 0 против, можно с уверенностью сказать, что это пройдет.

ext-hash всегда включен RFC

Как видно из заголовка, это расширение теперь постоянно доступно во всех установках PHP.

PEAR по умолчанию больше не включен ВНЕШНЕЕ

Поскольку PEAR больше не поддерживается, основная команда решила удалить установку по умолчанию с PHP 7.4.

Этот формат обмена данными никогда не был стандартизирован, и теперь его расширение устарело.

Короткие теги PHP устарели RFC

Короткий открытый тег array_merge и array_merge_recursive без аргументов

Поскольку добавлен оператор распаковки (. ), теперь имеет смысл использовать array_merge так:

Теперь array_merge и array_merge_recursive позволяют передавать пустой список параметров. Пустой массив будет возвращен, если не было передано ни одного массива.

strip_tags принимает массивы

Ранее несколько тегов можно было бы удалить только перечислением тегов в строке:

PHP 7.4 позволяет использовать массив:

Лево-ассоциативный тернарный оператор устареет RFC

Тернарный оператор имеет некоторые странные особенности в PHP. Этот RFC добавляет статус деприкейт для вложенных троичных операторов. В PHP 8 это устаревание будет преобразовано в ошибку времени при компиляции.

Устарели фигурные скобки для доступа к массивам и строкам

Раньше можно было получить доступ к массивам и смещениям строк, используя фигурные скобки:

Теперь лучше от этого отказаться.

Улучшение в proc_open улучшения

Были внесены изменения, чтобы proc_open мог выполнять программы, не проходя через shell. Это делается путем передачи массива вместо строки для команды .

Список некоторых устаревших вещей

  • Тип real
  • Magic quotes legacy
  • array_key_exists() с объектами
  • FILTER_SANITIZE_MAGIC_QUOTES фильтр
  • Метод Reflection export()
  • mb_strrpos() с указанием кодировки 3 аргументом
  • implode() параметр порядка смешивания
  • Открепление $this от нестатических замыканий ($closure->bindTo(null))
  • функция hebrevc()
  • функция convert_cyr_string()
  • функция money_format()
  • функция ezmlm_hash()
  • функция restore_include_path()
  • директива ini allow_url_include

Обратно несовместимые изменения

Так же не забываем смотреть на полный документ обновлений версий PHP.

Можно выделить следующие несовместимых назад изменений:

  • Вызов parent:: в классе без родителя вызовет ошибку.
  • Использование var_dump для DateTime или DateTimeImmutable больше не будет выводить доступные свойства объекта.
  • openssl_random_pseudo_bytes сгенерирует исключение в случае ошибки. Раньше она возвращала false, что могло привести к генерации пустой строки.
  • Попытка сериализации экземпляров PDO или PDOStatement сгенерирует Exception вместо PDOException.
  • Вызов get_object_vars() для ArrayObject экземпляре будет возвращать свойства самого ArrayObject, а не значения обернутого массива или объекта. Чтобы как раньше получить значения обернутого массива — приведите ArrayObject к типу array

Изменились правила голосования RFC RFC

Технически это не обновление, связанное с PHP 7.4, хотя это, безусловно, стоит упомянуть. Правила голосования для RFC были изменены: для принятия RFC требуется 2/3 голосов, все RFC должны быть открыты не менее 2 недель, чтобы пройти одобрение.

Веб-разработчик со стажем программирования более 6 лет, постоянно учусь, люблю делать новые проекты.

Релиз PHP 7 запланирован на конец ноября 2015 года.
В новой версии PHP появились интересные синтаксические плюшки, новые функции
а также самые долгожданные изменения коснулись ядра интерпретатора — проект phpng, увеличивает скорость
обработки скриптов практически вдвое по сравнению с PHP 5.x, плюс более эффективный менеджер памяти.

Итак, что изменилось?

Combined Comparison Operator

Объединенный оператор сравнения (spaceship operator — корабль) — шоткат для операция трехстороннего сравнения двух операндов.
Записывается в форме x = a b. Возвращает одно из трех значений:

Оператор имеет одинаковый приоритет с операциями сравнения (`==`, `!=`, `===`, `!==`) и работает также как и операторы (` =`, . ).
Также корабль не ассоциативен, то есть вы НЕ МОЖЕТЕ связать его с предыдущим вызовом (например `1 2 3`).

Объекты данным оператором сравнивать нельзя.

?? — Оператор объединения со значением NULL

Оператор является сокращенным вариантом вызова isset в тернарном операторе .

// до PHP7
$route = isset ( $_GET [ ‘route’ ] ) ? $_GET [ ‘route’ ] : ‘index’ ;
// или
$route = @ $_GET [ ‘route’ ] ) ? : ‘index’ ;

// PHP 7+
$route = $_GET [ ‘route’ ] ?? ‘index’ ;

Скалярные типы

Теперь в объявлениях переменных можно указывать их тип, даже если они являются скалярными (числа и строки).
По умолчанию используется кастинг для приведения к заданному типу, если вы хотите имееть более жесткий контроль,
можно включить strict режим, тогда при присвоении переменной значения, тип которого отличается от объявленного,
будет выброшено исключение TypeError.

строки ( `string` ) ,
целые ( `int` ) ,
числа ( `float` ) ,
бульки ( `bool` ) .

Типы аргументов , которые появились в php 5 . x

названия классов ,
интерфейсы ,
массив ` array `
и выполняемые `callable` аргументы .

// Coercive mode
function sumOfInts ( int . $ints )
<
return array_sum ( $ints ) ;
>

var_dump ( sumOfInts ( 2 , ‘3’ , 4.1 ) ) ; // int(9)

Чтобы включить строгий strict режим проверки, нужно в начале (каждого) файла, добавить вызов

Этот режим помимо обработки параметров влияет на возвращаемые значения!
В строгом режиме запрещен любой кастинг кроме конвертации int => float (но не наоборот)

declare ( strict_types = 1 ) ;

function multiply ( float $x , float $y )
<
return $x * $y ;
>

function add ( int $x , int $y )
<
return $x + $y ;
>

var_dump ( multiply ( 2 , 3.5 ) ) ; // float(7)
var_dump ( add ( ‘2’ , 3 ) ) ; // Fatal error: Uncaught TypeError: Argument 1 passed to add() must be of the type integer, string given.

Важно: Strict mode работает только по месту вызова функции, то есть если описание функции находится в файле с объявлением strict_types=1,
а вызывается она из другого файла без strict_types, то никакой строгой типизации не будет!

Необратимые изменения
Классы с именами `int`, `string`, `float`, and `bool` теперь запрещены.
Любое использование классов с этими названиями приведет к фатальным ошибкам.

Объявления возращаемых типов

Добавлена возможность указать тип переменной, возвращаемой функцией или методом или замыканием.

Следующие типы поддерживаются:

function arraysSum ( array . $arrays ) : array
<
return array_map ( function ( array $array ) : int <
return array_sum ( $array ) ;
> , $arrays ) ;
>

print_r ( arraysSum ( [ 1 , 2 , 3 ] , [ 4 , 5 , 6 ] , [ 7 , 8 , 9 ] ) ) ;

При использовании наследования в классах, дочерние методы должны соблюдать объявления возвращаемых типов
указанные в родительском классе / интерфейсе

class C
<
public function test ( ) : A
<
return new A ;
>
>

class D extends C
<
// overriding method C::test() : A
public function test ( ) : B // Fatal error due to variance mismatch
<
return new B ;
>
>

Объявление метода `D::test() : B` вызовет `E_COMPILE_ERROR` потому что многовариантность не дозволена.
Для того чтобы метод `D::test()` заработал, нужно указать что он возвращает нечто типа `A`.

interface SomeInterface
<
public function test ( ) : A ;
>

class B implements SomeInterface
<
public function test ( ) : A // Окей
<
return null ; // Fatal error: Uncaught TypeError: Return value of B::test() must be an instance of A, null returned.
>
>

В этот раз выполнение закончится эксепшном `TypeError`, потому что `null` не валидный возвратный тип, валидацию пройдет только экземпляр клааса `A`.

Анонимные классы. Да!

Аноимные классы подходят для небольших задач. Из часто используют в языках например C# или Java для выполнения колбэков.

// до PHP 7
class Logger
<
public function log ( $msg )
<
echo $msg ;
>
>

Читайте также:  Https www monitoring abbyy ru

$util -> setLogger ( new Logger ( ) ) ;

// PHP 7+
$util -> setLogger ( new class <
public function log ( $msg )
<
echo $msg ;
>
> ) ;

Анонимные классы позволяют делать тоже самое что и обычные классы: передавать данные в конструктор, наследовать другие классы, использовать трейты и т.п.

var_dump ( new class ( 10 ) extends Some > <
private $num ;

public function __construct ( $num )
<
$this -> num = $num ;
>

object ( class @ anonymous ) #1 (1) <
[ "Command line code0x104c5b612" : "class@anonymous" : private ] =>
int ( 10 )
>

Анонимные классы поддерживают вложенность. Вложенные классы не будут иметь доступа к private/protected свойствам внешнего класса.
Если такое необходимо, то нужно передать эти данные через конструктор вложенного класса.

class Outer
<
private $prop = 1 ;
protected $prop2 = 2 ;

protected function func1 ( )
<
return 3 ;
>

public function func2 ( )
<
return new class ( $this -> prop ) extends Outer <
private $prop3 ;

public function __construct ( $prop )
<
$this -> prop3 = $prop ;
>

public function func3 ( )
<
return $this -> prop2 + $this -> prop3 + $this -> func1 ( ) ;
>
> ;
>
>

echo ( new Outer ) -> func2 ( ) -> func3 ( ) ; // 6

Поддержка юникод управляющих (escape-) последовательностей

Теперь в "строках" и объявлениях heredoc можно использовать uXXXX последовательности для описания символов юникод

Метод call() у замыканий

Новый метод `call()` — шоткат для выполнения лямбды с прикрепленным объектом выполнения.

// до PHP 7
$getXCB = function ( ) < return $this ->x ; > ;
$getX = $getXCB -> bindTo ( new A , ‘A’ ) ; // биндим А к лямбде
echo $getX ( ) ; // 1

// PHP 7+
$getX = function ( ) < return $this ->x ; > ;
echo $getX -> call ( new A ) ; // 1

Фильтрация `unserialize()`

Новый функционал направлен на обеспечение безопасности сериализации объектов, предотвращает возможные code injection атаки,
давая возможность разработчику указать какие классы могут обрабатываться, а какие игнорироваться.

// конвертирует все объекты в __PHP_Incomplete_Class
$data = unserialize ( $foo , [ "allowed_classes" => false ] ) ;

// конвертирует все объекты в __PHP_Incomplete_Class object исключая MyClass и MyClass2
$data = unserialize ( $foo , [ "allowed_classes" => [ "MyClass" , "MyClass2" ] ) ;

// поведение по-умолчанию, разрешает все классы
$data = unserialize ( $foo , [ "allowed_classes" => true ] ) ;

Класс IntlChar

Новый класс IntlChar расширяет функциональность ICU (библиотека для локализации приложений International Components for Unicode)
Класс содержит статические методы и константы для работы с юникодом.

Для использования должно быть установлено расширение Intl.

Необратимые изменения
Классы в глобальном пространстве не могут называться IntlChar.

Ожидания — Expectations

Обратно совместимое расширение для классической функции `утверждения` (assert).

Если первый параметр функции равен false, то бросается исключение / выводится ошибка с AssertionError (второй параметр).

Assert позволяет отлаживать скрипты, при этом в продакш окружении вызовы будут игнорировать интерпритатором, т.е. ничего не стоить в плане ресурсов.

ini_set ( ‘assert.exception’ , 1 ) ;

class CustomError extends AssertionError

assert ( false , new CustomError ( ‘Что-то пошло не так’ ) ) ;

Добавлены две настройки PHP.ini, по-умолчанию:

— zend . assertions = 1
— assert . exception = 0

#zend.assertions может быть равен:
1 = обрабатывать утверждения assert ( режим разработки | development mode )
0 = генерировать код , но не выполнять
— 1 = игнорировать код ( 0 — стоимость , production mode )

#assert.exception
Включает возможность генерирования исключения вместо вывода ошибки и остановки скрипта ,
выключена для обратной совместимости со старым ` assert ( ) `

Группировка объявлений `use`

Если у импортируемых классов общее пространство имен, можно объединить их импорт в группу
(это относится к классам, функциям, константам, интерфейсам)

// до PHP 7
use some
amespace >;
use some
amespace >;
use some
amespace >as C ;

use function some
amespacefn_a ;
use function some
amespacefn_b ;
use function some
amespacefn_c ;

use const some
amespaceConstA ;
use const some
amespaceConstB ;
use const some
amespaceConstC ;

// PHP 7+
use some
amespace < >, >, >as C > ;
use function some
amespace < fn_a , fn_b , fn_c >;
use const some
amespace < ConstA , ConstB , ConstC >;

Возврат выражений в генераторах

Generator Return Expressions
Позволяет использовать `return (expression)` в генераторах.
Значение может быть получено вызовом метода `Generator::getReturn()`, только по завершении работы генератора.

$gen = ( function ( ) <
yield 1 ;
yield 2 ;

foreach ( $gen as $val ) <
echo $val , PHP_EOL ;
>

echo $gen -> getReturn ( ) , PHP_EOL ;

Возможность явно вернуть последнее значение — хорошая возможность, которая упрощает работу с генераторами.
Теперь не нужно проверять является ли значение последним. просто вызываем getReturn.

Делегирование генераторов

Generator Delegation
Построено на основе возможности возврата выражений из генератора.
Используется новый синтаксис:

будет вызываться до тех пор, пока возвращает данные, затем выполнения продолжится в вызывающем генераторе.
Это позволяет разбить сложный генератор на несколько маленьких — что способствует более чистому коду и его реюзабельности.

function gen ( )
<
yield 1 ;
yield 2 ;

return yield from gen2 ( ) ;
>

function gen2 ( )
<
yield 3 ;

foreach ( $gen as $val )
<
echo $val , PHP_EOL ;
>

echo $gen -> getReturn ( ) ;

Целочисленное деление intdiv()

Функция intdiv() позволяет делить числа на выходе получая целые числа.

Необратимые изменения
Ключевое слово `intdiv` зарезервировано для глобального контекста.

Параметры session_start()

Теперь возможно передавать параметры функции session_start().
Опции — стандартные настройки сессий из php.ini.

Добавился новая настройка для сессий `session.lazy_write`, по-умолчанию включена.

Функция preg_replace_callback_array()

Альтернатива preg_replace_callback, когда требуется обработать несколько условий в коллбеке.
Позволяет передать в качестве обратной функции — массив [‘/regex’/ => callback, . ].

$tokenStream = [ ] ; // [tokenName, lexeme] pairs

// до PHP 7
preg_replace_callback (
[


] ,
function ( $match ) use ( & $tokenStream ) <
if ( strpos ( $match [ 0 ] , ‘$’ ) === 0 ) <
$tokenStream [ ] = [ ‘T_VARIABLE’ , $match [ 0 ] ] ;
> elseif ( strpos ( $match [ 0 ] , ‘=’ ) === 0 ) <
$tokenStream [ ] = [ ‘T_ASSIGN’ , $match [ 0 ] ] ;
> elseif ( ctype_digit ( $match [ 0 ] ) ) <
$tokenStream [ ] = [ ‘T_NUM’ , $match [ 0 ] ] ;
> elseif ( strpos ( $match [ 0 ] , ‘;’ ) === 0 ) <
$tokenStream [ ] = [ ‘T_TERMINATE_STMT’ , $match [ 0 ] ] ;
> elseif ( strpos ( $match [ 0 ] , ‘//’ ) === 0 ) <
$tokenStream [ ] = [ ‘T_COMMENT’ , $match [ 0 ] ] ;
>
> ,
$input
) ;

// PHP 7+
preg_replace_callback_array (
[

Необратимые изменения
Имя `preg_replace_callback_array` зарезервировано.

Объявления скалярных типов введена в двух вариантах: принудительный (по умолчанию) и строгий. Следующие типы могут использоваться для объявления параметров (в обоих вариантах): строки ( string ), целые (int), числа с плавающей точкой ( float ) и логические значения (bool). Они дополняют аргументы других типов, введенных в PHP 5: имена классов, интерфейсов, array и callable .

// Принудительный режим
function sumOfInts ( int . $ints )
<
return array_sum ( $ints );
>

var_dump ( sumOfInts ( 2 , ‘3’ , 4.1 ));

Результат выполнения данного примера:

Для установки строгого режима, в самом начале файла необходимо поместить одну директиву declare. Это означает, что строгость объявления скалярных типов работает на уровне файла и не затрагивает весь остальной код. Эта директива затрагивает не только объявления параметров, но и возвращаемые значения функций (см. объявления возвращаемого типа), встроенные функции PHP и функции загруженных расширений.

Подробную документацию и примеры использования читайте в разделе декларация типов.

Объявления возвращаемых значений

В PHP 7 добавлена поддержка объявления возвращаемого типа. Аналогично как и объявления типов аргументов, объявление типа возвращаемого значения указывает, значение какого типа должна вернуть функция. Для объявления типа возвращаемого значения доступны все те же типы, что и для объявления типов аргументов.

function arraysSum (array . $arrays ): array
<
return array_map (function(array $array ): int <
return array_sum ( $array );
>, $arrays );
>

print_r ( arraysSum ([ 1 , 2 , 3 ], [ 4 , 5 , 6 ], [ 7 , 8 , 9 ]));

Результат выполнения данного примера:

Полную документацию и примеры использования читайте в разделе про объявление возвращаемого типа.

Оператор объединения с null

Был добавлен оператор объединения с null (??), являющийся синтаксическим сахаром для достаточно распространенного действия, когда совместно используются тернарный оператор и функция isset() . Он возвращает первый операнд, если он задан и не равен NULL , а в обратном случае возвращает второй операнд.

Читайте также:  Gear vr with controller

// Извлекаем значение $_GET[‘user’], а если оно не задано,
// то возвращаем ‘nobody’
$username = $_GET [ ‘user’ ] ?? ‘nobody’ ;
// Это идентично следующему коду:
$username = isset( $_GET [ ‘user’ ]) ? $_GET [ ‘user’ ] : ‘nobody’ ;

// Данный оператор можно использовать в цепочке.
// В этом примере мы сперва проверяем, задан ли $_GET[‘user’], если нет,
// то проверяем $_POST[‘user’], и если он тоже не задан, то присваеваем ‘nobody’.
$username = $_GET [ ‘user’ ] ?? $_POST [ ‘user’ ] ?? ‘nobody’ ;
?>

Оператор spaceship (космический корабль)

Этот оператор предназначен для сравнения двух выражений. Он возвращает -1, 0 или 1 если $a , соответственно, меньше, равно или больше чем $b . Сравнение производится в соответствии с правилами сравнения типов PHP.

// Целые числа
echo 1 1 ; // 0
echo 1 2 ; // -1
echo 2 1 ; // 1

// Числа с плавающей точкой
echo 1.5 1.5 ; // 0
echo 1.5 2.5 ; // -1
echo 2.5 1.5 ; // 1

// Строки
echo "a" "a" ; // 0
echo "a" "b" ; // -1
echo "b" "a" ; // 1
?>

Определение констант массивов с помощью define()

Можно определить константу типа array с помощью функции define() . В PHP 5.6 такие константы можно было задавать только с помощью const.

echo ANIMALS [ 1 ]; // выводит "cat"
?>

Анонимные классы

Была добавлена поддержка анонимных классов с помощью new class. Их можно использовать тогда, когда нужен одноразовый класс и создавать полноценный класс, а потом его объект не имеет смысла:

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 ());
?>

Результат выполнения данного примера:

Подробную документацию и примеры использования читайте в разделе про анонимные классы.

Синтаксис кодирования Unicode

Он принимает шестнадцатеричный код Unicode и записываем его в формате UTF-8 в двойных кавычках или формате heredoc. Любой корректный код будет принят. Ведущие нули по желанию.

Результат выполнения данного примера:

Closure::call()

Closure::call() является более производительным и коротким способом временного связывания области действия объекта с замыканием и его вызовом.

// До PHP 7
$getX = function() x ;>;
$getXCB = $getX -> bindTo (new A , ‘A’ ); // промежуточное замыкание
echo $getXCB ();

// PHP 7+
$getX = function() x ;>;
echo $getX -> call (new A );

Результат выполнения данного примера:

unserialize() с фильтрацией

Этот функционал обеспечивает более высокий уровень безопасности при десериализации объектов с непроверенными данными. Это позволяет предотвратить возможную инъекцию кода, позволяя разработчику использовать белый список классов для десериализации.

// Преобразование всех объектов в __PHP_Incomplete_Class
$data = unserialize ( $foo , [ "allowed_classes" => false ]);

// Преобразование всех объектов, кроме MyClass и MyClass2 в __PHP_Incomplete_Class
$data = unserialize ( $foo , [ "allowed_classes" => [ "MyClass" , "MyClass2" ]]);

// Поведение по умолчанию принимает все классы (можно просто не задавать второй аргумент)
$data = unserialize ( $foo , [ "allowed_classes" => true ]);

IntlChar

Новый класс IntlChar добавляет новую функциональность в ICU. Класс определяет несколько статических методов и констант для манипулирования символами Unicode.

Результат выполнения данного примера:

Для использования это класса необходимо установить расширение Intl.

Ожидания

Ожидания являются улучшенной, обратно совместимой версией старой функции assert() . Они позволяют делать предположения с нулевой стоимостью в промышленном коде и предоставляют возможность выбрасывать пользовательские исключения в случае провала ожидания.

Вместе тем, что старое API поддерживается, assert() теперь является языковой конструкцией, принимающей первым аргументом выражения, а не только строки для оценки или логические значения для проверки.

class CustomError extends AssertionError <>

assert ( false , new CustomError ( ‘Сообщение об ошибке’ ));
?>

Результат выполнения данного примера:

Подробное описание этого функционала, а также инструкции для его конфигурирования для тестовых и промышленных сред, читайте в секции Ожидания раздела, посвященному assert() .

Групповые объявления use

Классы, функции и константы импортируемые из одного и того же namespace, теперь можно группировать в одном операторе use.

// До PHP 7
use some
amespace ClassA ;
use some
amespace ClassB ;
use some
amespace ClassC as C ;

use function some
amespace fn_a ;
use function some
amespace fn_b ;
use function some
amespace fn_c ;

use const some
amespace ConstA ;
use const some
amespace ConstB ;
use const some
amespace ConstC ;

Выражение return в генераторах

Эта функциональность добавлена к генераторам, введенным в PHP 5.5. Она позволяет использовать оператор return в генераторах в качестве окончательного возвращаемого значения (возврат по ссылке недопустим). Это значение можно извлечь с помощью нового метода Generator::getReturn(), который можно использовать только после того, как генератор вернул все сгенерированные значение.

= (function() <
yield 1 ;
yield 2 ;

foreach ( $gen as $val ) <
echo $val , PHP_EOL ;
>

echo $gen -> getReturn (), PHP_EOL ;

Результат выполнения данного примера:

Возможность явно получать окончательное значение генератора является очень полезной, так как позволяет клиентскому коду, использующему генератор, получать и обработать самое последнее значение генератора, после которого точно ничего больше не будет. Это сильно проще, чем вынуждать разработчика проверять, последнее ли значение вернулось и как-то по особенному его обрабатывать.

Делегация генератора

Теперь генератор может автоматически делегировать другому генератору, объекту класса, реализующий Traversable или массиву без необходимости писать в нем дополнительную обработку полученных значений. Достигается это с помощью конструкции yield from.

function gen ()
<
yield 1 ;
yield 2 ;
yield from gen2 ();
>

function gen2 ()
<
yield 3 ;
yield 4 ;
>

foreach ( gen () as $val )
<
echo $val , PHP_EOL ;
>
?>

Результат выполнения данного примера:

Функция целочисленного деления intdiv()

Новая функция intdiv() производит целочисленное деление операндов и возвращает его результат.

Результат выполнения данного примера:

Опции сессий

Теперь session_start() принимает массив опций, которые переопределят конфигурационные директивы сессии установленные в php.ini.

Также опции были расширены включенной по умолчанию опцией session.lazy_write, которая говорит PHP о том, что файл сессии надо перезаписывать, только если изменились данные сессии, и опцией read_and_close, которую можно задать только через session_start() для того, чтобы PHP закрывал сессию сразу же как прочитает ее данные и не вносил в нее каких либо изменений.

К примеру, для установки session.cache_limiter равным private и немедленному закрытию сессии после чтения ее данных:

preg_replace_callback_array()

Новая функция preg_replace_callback_array() позволяет писать более чистый код, когда требуется использовать функцию preg_replace_callback() . До PHP 7 при необходимости обработать разные регулярные выражения разными функциями приходилось для каждой такой обработки писать отдельный вызов функции.

Теперь можно использовать одну функцию, передавая в нее ассоциативный массив, ключами которого являются регулярные выражения, а значениями — функции обратного вызова.

Функции CSPRNG

Были добавлены две новые кроссплатформенные функции для генерации криптографически безопасных строк и целых чисел: random_bytes() и random_int() .

Теперь функция list() всегда может распаковывать объекты, реализующие ArrayAccess

Ранее функция list() не гарантировала корректную обработку объектов, реализующих ArrayAccess. Теперь это исправлено.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

code