PHP 7.1 - Что нового

Категория: / DEV Блог / PHP (LAMP)
Nullable types (типы допускающие возможность использования null)

Ранее в PHP 7.0 появилась возможность указать тип передаваемых/возвращаемых значений, однако строгая типизация недопускала использование null в качестве значения параметра, как это делается в других языках.

В 7.1 для указания допустимости null-значений перед типом параметра указывается "?"

function f01(int $i) {
  var_dump($a);
}
 
function f02(?int $i) : ?int {
  var_dump($a);
  return $a;
}
 
f01(10); // int(10)
f01(null); // TypeError: Argument 1 passed to f01() must be of the type integer, null given
f02(20); // int(10)
f02(null); // null


Важно! Использование модификатора ? не означает что параметр станет опциональным (равным null). Вызов функции без указания параметра вызовет ошибку Uncaught Error: Too few arguments to function name(), 0 passed


Void Return Type (возвращаемый тип void)

Добавлен новый возвращаемый тип void. Тип говорит сам за себя, если вы когда нибудь программировали на "Си". Функция с типом void не должна ничего возвращать, т.е. в теле функции отсутствует оператор return или присутствует пустой return; Обратите внимание, что вызов "return null" вызовет ошибку.

Возвращаемым значением void функции всегда будет null.

function voidFunc01($a) : void {
        return; //just do it!
}
 
function voidFunc02($a) : void {
        return $a;
}
 
var_dump(voidFunc01("1")); // null
var_dump(voidFunc02("1")); // Fatal error: A void function must not return a value in .. file



Поддержка ключей в list() (Симметричный разбор массива)

Теперь можно использовать сокращенный синтаксис определения массива использовать для его декомпозиции.

$fruits = [[1, 'Apple'], [2, 'Orange']];
 
list($id, $fruit) = $fruits[0]; // list style
[$id, $fruit] = $fruits[0]; // [] style
 
// также в цикле foreach
foreach ($fruit as ($id, $fruit)) {...} // list style
foreach ($fruit as [$id, $fruit]) {...} // [] style



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

Ну что, дождались! Конец публичным костантам, теперь для констант можно указать видимость

class ConstClass
{
    const CONST_ONE = 1; // public
    public const CONST_TWO = 2; // public too
    protected const CONST_THREE = 3; // protected
    private const CONST_FOUR = 4; // private
}



Псевдотип iterable

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

function f01(iterable $data) {
    foreach ($data as $k => $v) {
        echo $k, ':', $v, PHP_EOL;
    }
}
 
//массив
f01([10, 20, 30]); // 0:10 1:20 2:30
 
//объект
f01(new SplFixedArray(3)) // 0: 1: 2:
 
//генератор
function myGen() {
    yield 10;
    yield 20;
    yield 30;
}
f01(myGen()); // 0:10 1:20 2:30



Множественный отлов исключений

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

try {
    // ...
} catch (FirstException | SecondException $e) {
    // вот так
}




Отрицательные смещения в строках

Позволяет находить символы с конца строки.

$string[-1] (аналог substr($string, -1, 1))
$string{-1}
 
//тестируем юникод строки
 
// test.bat
@chcp 65001
php -f test.php
 
// test.php
var_dump('тест', 'тест'{1}, 'тест'{-1}, 'тест'[-1]);
 
string(8) "тест"
string(1) "�"
string(1) "�"
string(1) "�"


Видим, что с юникодом получается не очень хорошо..


Конвертация callable в closure /замыкания

Добавлен статичный метод к Closure::fromCallable()

class SomeClass
{
  public  function one() { return Closure::fromCallable([$this, 'two']); }
  private function two($a) { var_dump($a); }
}
 
$func = (new SomeClass)->one();
$func('test'); //string(4) "test"


Документация: Изменения в PHP 7.1


Есть еще несколько не/значительных обратнонесовместимых изменений

Исключение при неуказании обязательных параметров

function test($param){}
test();
//Uncaught Error: Too few arguments to function test(), 0 passed in %s on line %d and exactly 1 expected in %s:%d



Более строгая арифметика

Усилена типизация, когда используются строковые аргументы при арифметических операциях:

echo 5 + 'What';
 
//php70
5
 
// php71 выведет предупреждение
Warning: A non-numeric value encountered
5


Экспоненциальная форма учитывается в строке:

echo "1.2345e9" + 0,
PHP_EOL,
(int) "1.2345e9";
 
//php70
1234500000
1
 
//php71
1234500000
1234500000



Mcrypt deprecated

Mcrypt устарел (библиотека не поддерживается с 2007 года).
При использовании функций mcrypt будет генерироваться сообщение E_DEPRECATED.
В следующей версии php библиотеку выпилят окончательно. Рекомендуется переходить на openssl.