PHP 7.1+


7.1+

== Обнуляемые типы параметров функций ==

function testReturn(): ?string
{
    return 'elePHPant';
}

var_dump(testReturn());

function testReturn(): ?string
{
    return null;
}

var_dump(testReturn());

function test(?string $name)
{
    var_dump($name);
}

test('elePHPant');
test(null);
test();



== Функции без возврата ==

function swap(&$left, &$right): void
{
    if ($left === $right) {
        return;
    }

    $tmp = $left;
    $left = $right;
    $right = $tmp;
}

$a = 1;
$b = 2;
var_dump(swap($a, $b), $a, $b);



== Расширенная распаковка массива, аналогичная list ==

$data = [
    [1, 'Tom'],
    [2, 'Fred'],
];

// используя list()
list($id1, $name1) = $data[0];

// используя []
[$id1, $name1] = $data[0];

// используя list()
foreach ($data as list($id, $name)) {
    // код, содержащий $id и $name
}

// используя []
foreach ($data as [$id, $name]) {
    // код, содержащий $id и $name
}


== Поддержка ключей в list() ==

$data = [
    ["id" => 1, "name" => 'Tom'],
    ["id" => 2, "name" => 'Fred'],
];

// стиль list()
list("id" => $id1, "name" => $name1) = $data[0];

// стиль []
["id" => $id1, "name" => $name1] = $data[0];

// стиль list()
foreach ($data as list("id" => $id, "name" => $name)) {
    // logic here with $id and $name
}

// стиль []
foreach ($data as ["id" => $id, "name" => $name]) {
    // logic here with $id and $name
}


== Видимость констант класса ==

class ConstDemo
{
    const PUBLIC_CONST_A = 1;
    public const PUBLIC_CONST_B = 2;
    protected const PROTECTED_CONST = 3;
    private const PRIVATE_CONST = 4;
}


== Псевдотип iterable ==

(Аналогичный callable)

function iterator(iterable $iter)
{
    foreach ($iter as $val) {
        //
    }
}


== Обработка нескольких исключений сразу ==

try {
    // Какой то код
} catch (FirstException | SecondException $e) {
    // Обрабатываем оба исключения
}


== Преобразование callable в Closure ==

class Test
{
    public function exposeFunction()
    {
        return Closure::fromCallable([$this, 'privateFunction']);
    }

    private function privateFunction($param)
    {
        var_dump($param);
    }
}

$privFunc = (new Test)->exposeFunction();