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 и считается бесполезным.

Для получения дополнительной информации свяжитесь со мной или следуйте за мной на:

https://twitter.com/minompi

https://github.com/AlessandroMinoccheri