Что нового в 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 );

Заметка встроена в: PHP 5.3 - 8.5 — Синтаксис, Новинки