PHP 7.1 - Что нового
Категория: / DEV Блог
/ PHP (LAMP)
Nullable types (типы допускающие возможность использования null)
Ранее в PHP 7.0 появилась возможность указать тип передаваемых/возвращаемых значений, однако строгая типизация недопускала использование null в качестве значения параметра, как это делается в других языках.
В 7.1 для указания допустимости null-значений перед типом параметра указывается "?"
Важно! Использование модификатора ? не означает что параметр станет опциональным (равным null). Вызов функции без указания параметра вызовет ошибку Uncaught Error: Too few arguments to function name(), 0 passed
Void Return Type (возвращаемый тип void)
Добавлен новый возвращаемый тип void. Тип говорит сам за себя, если вы когда нибудь программировали на "Си". Функция с типом void не должна ничего возвращать, т.е. в теле функции отсутствует оператор return или присутствует пустой return; Обратите внимание, что вызов "return null" вызовет ошибку.
Возвращаемым значением void функции всегда будет null.
Поддержка ключей в list() (Симметричный разбор массива)
Теперь можно использовать сокращенный синтаксис определения массива использовать для его декомпозиции.
Видимость констант в классах
Ну что, дождались! Конец публичным костантам, теперь для констант можно указать видимость
Псевдотип iterable
Введен новый тип iterable для передаваемых/возвращаемых значений. Может использоваться при передаче массивов или объектов, которые соответствуют интерфейсу Traversable.
Множественный отлов исключений
При обработке исключений появилась возможность указать через знак трубы "|" несколько вариантов исключений за один раз.
Отрицательные смещения в строках
Позволяет находить символы с конца строки.
Видим, что с юникодом получается не очень хорошо..
Конвертация callable в closure /замыкания
Добавлен статичный метод к Closure::fromCallable()
Документация: Изменения в PHP 7.1
Есть еще несколько не/значительных обратнонесовместимых изменений
Исключение при неуказании обязательных параметров
Более строгая арифметика
Усилена типизация, когда используются строковые аргументы при арифметических операциях:
Экспоненциальная форма учитывается в строке:
Mcrypt deprecated
Mcrypt устарел (библиотека не поддерживается с 2007 года).
При использовании функций mcrypt будет генерироваться сообщение E_DEPRECATED.
В следующей версии php библиотеку выпилят окончательно. Рекомендуется переходить на openssl.
Ранее в 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.