PHP 7.2 имеет много особенностей, касающихся безопасности, реализаций и устаревших функций.
Кроме того, он вводит прирост производительности (уже в версии 7 была проделана большая работа): PHP 7.2 составляет 20% быстрее, чем версия 7.0 и на 10% быстрее, чем версия 7.1.
Вот все функции, предлагаемые этой новой версией.
Аргумент подсказки типа
Начиная с PHP 5 можно было указать тип аргумента, передаваемого функции.
Пример:
class SimpleClass { public $foo = ‘bar’; } $simpleClass = new SimpleClass; function test(SimpleClass $simpleClass){ return $simpleClass->foo; } echo test($simpleClass);
Начиная с PHP 7.1, если в функцию было передано значение типа, отличного от SimpleClass, возникала ошибка 500.
В PHP 7.2 аргумент подсказка типа может быть объявлен как объект, что означает, что это универсальный объект.
Пример:
class SimpleClass { public $foo = ‘bar’; } class FirstClass extends SimpleClass { public $foo = ‘baz’; } class SecondClass extends SimpleClass{ public $foo = ‘foobar’; } $firstClass = new FirstClass; $secondClass = new SecondClass; function test(object $arg) { return $arg->var; } echo test($firstClass); echo test($secondClass);
В этом примере код запускается, объявляя тип объекта-аргумента, а затем универсальный объект, поэтому он не генерирует ошибку 500.
Кроме того, эта функция позволяет реализовать тип «дисперсия», например, в подклассе.
Объект становится значением ключа с версии 7.2, поэтому не используйте его для имен классов, интерфейсов или трейтов.
Введите возвращаемое значение подсказки
Начиная с версии 7.2 можно объявить возвращаемое значение подсказки типа как объект.
Пример:
function test($arg) :object { return new Foo($arg); }
Абстрактные методы и перезаписываемые интерфейсы
PHP 7.2 позволяет перезаписывать абстрактные методы и интерфейсы, то есть опускать тип объявления параметра в абстрактном методе, расширенном родительским классом.
Пример:
abstract class foo { abstract function baz(string $yourVar); } abstract class bar extends foo { abstract function baz($yourVar) : int; }
Та же функциональность применима и к интерфейсам, например:
interface foo { public function test(string $yourVar); } class bar implements foo { public function test($yourVar) { //your code } }
Эта новая функция позволяет обновлять родительские классы без обновления всех его подклассов.
Вероятно, это незначительное улучшение (его никогда не будут использовать так часто).
Запятая в синтаксисе в конце списка операторов использования
Запятая в конце последнего элемента массива допустима в синтаксисе PHP, и иногда рекомендуется легко добавлять новые элементы и избегать ошибок анализа, пропуская запятую.
Начиная с версии PHP 7.2 можно использовать запятые даже для «использования» внутри классов.
Пример:
use Foo\Bar\{ Foo, Bar, Baz, };
Argon2 в хеше пароля
Argon2 — это мощный алгоритм хеширования, который был выбран победителем конкурса хеширования паролей 2015 года, а PHP 7.2 представляет собой безопасную замену алгоритму Bcrypt.
В новой версии PHP представлена константа PASSWORD_ARGON2I, которую теперь можно использовать в функции password_ *, следуя следующему синтаксису:
password_hash(‘secretpassword’, PASSWORD_ARGON2I);
Несмотря на то, что Bcrypt требует только один фактор, Argon2 учитывает три разных фактора:
- Стоимость памяти, которая определяет количество килобайт для использования во время хеширования (стандартные значения: 1 ‹‹ 10 или 1024 КиБ или 1 МБ);
- Стоимость времени, определяющая количество взаимодействий алгоритма хеширования (стандартное значение — 2);
- Коэффициент параллелизма, задающий номер параллельного потока, который будет использоваться при хэшировании (стандартное значение — 2);
Три новых константы определяют факторы стандартной стоимости:
1. ПАРОЛЬ_ARGON2_DEFAULT_MEMORY_COST
2. ПАРОЛЬ_ARGON2_DEFAULT_TIME_COST
3. ПАРОЛЬ_ARGON2_DEFAULT_THREADS
Пример:
$options = [‘memory_cost’ => 1<<11, ‘time_cost’ => 4, ‘threads’ => 2]; password_hash(‘secretpassword’, PASSWORD_ARGON2I, $options);
Libsodium как часть PHP Core
Начиная с версии 7.2, PHP включает в свое ядро библиотеку Sodium. Libsodium — это кроссплатформенная библиотека и кросс-языки для шифрования, дешифрования, подписей, хеширования паролей и многого другого.
Ранее эта библиотека была доступна PECL.
PHP 7.2 — это первый язык программирования, который добавляет современные шифрование в своих библиотеках.
Подсчет скалярных значений
Знаете ли вы, что можно считать скалярные значения? На самом деле это несущественно, так как функция count() возвращает только 1 для скаляров.
Пример:
var_dump(count(null)); // int(0) var_dump(count(0)); // int(1) var_dump(count(4)); // int(1) var_dump(count(‘4’)); // int(1)
Начиная с PHP 7.2, он покажет сообщение:
Warning: count(): The parameter must be an array or an object that implements Countable into / in / 4aIl2 on line 3.
Новые возможности
В PHP 7.2 представлены некоторые новые функции, которые могут быть очень полезными: ftp_append(), hash_hmac_algos(), imagesetclip(), imagegetclip(), imageopenpolygon(), imageresolution(), imagecreatefrombmp(), imagebmp().
Устаревшие функции
Функция assert() проверяет утверждение данных и предпринимает соответствующие действия, если результат FALSE.
Использование assert() со строковым аргументом теперь не рекомендуется, поскольку открывает уязвимость RCE.
Функция __autoload была заменена на spl_autoload_register в PHP 5.1.
Теперь при ее обнаружении во время компиляции выдается сообщение об устаревании.
Переменная $php_errormsg создается в локальной области видимости при возникновении нефатальной ошибки. Начиная с PHP 7.2 вместо них следует использовать error_get_last и error_clear_last.
create_function() позволяет создать функцию с сгенерированным именем функции, списком аргументов и телом кода, переданным в качестве аргументов. Из-за проблем с безопасностью и неадекватной производительности он был подписан как устаревший (в противном случае рекомендуется использовать вложение).
each() используется для перебора массива, аналогичного foreach(), который работает в 10 раз быстрее.
$errcontext — это массив, содержащий локальные существующие переменные на момент генерации ошибки.
gmp_random() считается зависимым от платформы и будет объявлен устаревшим. В противном случае предлагается использовать gmp_random_bits() и gmp_random_rage().
Для mbstring.func_overload параметр ini, вставленный в значение по умолчанию, отличное от нуля, был помечен как устаревший.
parse_str() анализирует строку запроса в массиве, если передан второй аргумент или не используется локальная таблица символов. Поскольку настройка динамических переменных функции не рекомендуется из соображений безопасности, использование parse_str() без второго аргумента будет генерировать совет об устаревании.
(unset)cast — это выражение, которое всегда возвращает значение null и считается бесполезным.
Для получения дополнительной информации свяжитесь со мной или следуйте за мной на: