Что нового в PHP 7.3
- Wiki: PHP 7.3
- github: Список изменений PHP 7.3
Heredoc и Nowdoc ― Улучшен синтаксис
wiki: https://wiki.php.net/rfc/flexible_heredoc_nowdoc_syntaxes
Закрывающий маркер теперь может иметь отступы TAB или Пробелы.
Синтаксис heredoc и nowdoc имели очень жесткие требования. Это привело к тому, что разработчики начали их избегать, поскольку их использование в коде выглядело некрасиво и ухудшало читаемость.
Поэтому были внесены два изменения:
Разрешить отступ для закрывающего маркера.
// новый синтаксис:
class foo {
public $bar = <<<EOT
bar
EOT;
}
// раньше приходилось писать так:
<?php
class foo {
public $bar = <<<EOT
bar
EOT;
}
Еще примеры как это работает с отступами:
// no indentation echo <<<END b c END; /* b c */ // 4 spaces of indentation echo <<<END b c END; /* b c */
Убрать требование новой строки после закрывающего маркера.
Стало возможно писать так:
stringManipulator(<<<END b c END); $values = [<<<END b c END, 'd e f'];
Было так:
stringManipulator(<<<END a b c END ); $values = [<<<END a b c END , 'd e f'];
list( &$a ) — cсылки в list()
В PHP уже давно существует list() и ссылки. Однако до php 7.3 не было возможности использовать присваивание ссылок с помощью list().
$array = [ 1, 2 ]; list( $a, &$b ) = $array; // или через деструктуризацию [ $a, &$b ] = $array;
Конечно, это работает так же, как обычно работает list(), поэтому вы можете использовать его с вложенным list() и пропускать значения:
$array = [ 1, 2, 3, [3, 4] ]; list( &$a, $b,, list( &$c, $d ) ) = $array;
Он также работает с функцией foreach():
$array = [ [1, 2], [3, 4] ];
foreach ( $array as list( &$a, $b ) ) {
$a = 7;
}
var_dump( $array )
/*
array(2) {
[0]=> array(2) {
[0]=> int(7)
[1]=> int(2)
}
[1]=> array(2) {
[0]=> &int(7)
[1]=> int(4)
}
}
*/
is_countable() — функция
Этот RFC предлагает новую функцию типа, которая возвращает true, если заданное значение является типом массива или экземпляром интерфейса Countable.
Нужно было проверять так:
if ( is_array($foo) || $foo instanceof Countable ) {
// $foo is countable
}
Теперь можно так:
if ( is_countable($foo) ) {
// $foo is countable
}
Еще примеры:
var_dump(is_countable([1, 2, 3])); // bool(true) var_dump(is_countable(new ArrayIterator(['foo', 'bar', 'baz']))); // bool(true) var_dump(is_countable(new ArrayIterator())); // bool(true) var_dump(is_countable(new stdClass())); // bool(false)
$foo = [ '', [] ];
if ( is_countable( $foo ) ) {
var_dump( count( $foo ) ); // int(2)
}
array_(key|value)_(first|last)() — новые функции
Поскольку массивы являются мощной структурой данных, в некоторых случаях удобно получить первый или последний ключ/значение массива без обходного пути. Для выполнения этой задачи данный RFC добавляет в ядро четыре функции:
$key = array_key_first( $array ); $key = array_key_last( $array ); $value = array_value_first( $array ); $value = array_value_last( $array );
—