PHP 8.4.1 Released!

Новые возможности

Константные выражения

Теперь можно предоставить скалярное выражение, которое включает числовые и строковые литералы и (или) константы, когда раньше ожидалось статическое значение, например, в объявлениях констант или значениях аргументов функций по умолчанию.

<?php

const ONE = 1;
const
TWO = ONE * 2;

class
C
{
const
THREE = TWO + 1;
const
ONE_THIRD = ONE / self::THREE;
const
SENTENCE = 'Значение константы THREE - '.self::THREE;

public function
f($a = ONE + self::THREE)
{
return
$a;
}
}

echo (new
C)->f()."\n";
echo
C::SENTENCE;

?>

Результат выполнения приведённого примера:

4
Значение константы THREE — 3

Массив (array) также определяют через ключевое слово const:

<?php

const ARR = ['a', 'b'];

echo
ARR[0];

?>

Результат выполнения приведённого примера:

a

Функции с переменным количеством аргументов через оператор ...

Функции с переменным количеством аргументов теперь разрешается реализовывать через оператор ..., вместо того чтобы полагаться на функцию func_get_args().

<?php

function f($req, $opt = null, ...$params)
{
// Переменная $params — массив, который содержит остальные аргументы
printf(
'$req: %d; $opt: %d; количество параметров: %d' . "\n",
$req,
$opt,
count($params)
);
}

f(1);
f(1, 2);
f(1, 2, 3);
f(1, 2, 3, 4);
f(1, 2, 3, 4, 5);

?>

Результат выполнения приведённого примера:

$req: 1; $opt: 0; количество параметров: 0
$req: 1; $opt: 2; количество параметров: 0
$req: 1; $opt: 2; количество параметров: 1
$req: 1; $opt: 2; количество параметров: 2
$req: 1; $opt: 2; количество параметров: 3

Распаковка аргументов через оператор ...

Массивы и объекты, которые реализуют интерфейс Traversable, разрешается распаковывать в список аргументов при вызове функций и передаче аргументов через оператор .... В других языках, включая Ruby, оператор знают как splat- или spread-оператор.

<?php

function add($a, $b, $c)
{
return
$a + $b + $c;
}

$operators = [2, 3];
echo
add(1, ...$operators);

?>

Результат выполнения приведённого примера:

6

Возведение в степень через оператор **

Добавили правоассоциативный оператор ** возведения в степень, и короткий синтаксис **= присваивания.

<?php

printf
("2 ** 3 == %d\n", 2 ** 3);
printf("2 ** 3 ** 2 == %d\n", 2 ** 3 ** 2);

$a = 2;
$a **= 3;
printf("a == %d\n", $a);

?>

Результат выполнения приведённого примера:

2 ** 3 ==      8
2 ** 3 ** 2 == 512
a ==           8

Конструкции use function и use const

Оператор use расширили, чтобы в дополнение к классам поддержать импорт функций и констант. Конструкция use function импортирует функции, а конструкция use const — константы.

<?php

namespace Name\Space {
const
FOO = 42;

function
f()
{
echo
__FUNCTION__."\n";
}
}

namespace {
use const
Name\Space\FOO;
use function
Name\Space\f;

echo
FOO."\n";
f();
}

?>

Результат выполнения приведённого примера:

42
Name\Space\f

phpdbg

Теперь PHP содержит интерактивный отладчик phpdbg, который реализовали как SAPI-модуль. Подробности даёт документация к модулю phpdbg.

Кодировка по умолчанию

Для функций htmlentities(), html_entity_decode() и htmlspecialchars() добавили директиву default_charset, которая устанавливает набор символов по умолчанию. Обратите внимание: при установке параметров кодировки для модулей iconv и mbstring, которые теперь устарели, они будут иметь приоритет над ini-параметром default_charset для функций модулей iconv и mbstring.

Значение по умолчанию для настройки — UTF-8.

Переиспользование обёртки php://input

Поток php://input теперь разрешается переоткрывать и считывать столько раз, сколько требуется. Эта работа также значительно сократила объём памяти, который требуется для обработки данных POST-запросов.

Загрузка больших файлов

Теперь разрешается загружать файлы размером больше 2 ГБ.

Модуль GMP поддерживает перегрузку операторов

Объекты GMP теперь поддерживают перегрузку операторов и приведение к скалярным типам. Перегрузка операторов делает код с функциями модуля GMP выразительнее:

<?php

$a
= gmp_init(42);
$b = gmp_init(17);

if (
version_compare(PHP_VERSION, '5.6', '<')) {
echo
gmp_intval(gmp_add($a, $b)), PHP_EOL;
echo
gmp_intval(gmp_add($a, 17)), PHP_EOL;
echo
gmp_intval(gmp_add(42, $b)), PHP_EOL;
} else {
echo
$a + $b, PHP_EOL;
echo
$a + 17, PHP_EOL;
echo
42 + $b, PHP_EOL;
}

?>

Результат выполнения приведённого примера:

59
59
59

Безопасное сравнение строк функцией hash_equals() для предотвращения атак по времени

Добавили функцию hash_equals() для сравнения двух строк за постоянное время. Функция снижает риск атаки по времени; например, во время тестирования хеширования паролей функцией crypt(), когда невозможно использовать функции password_hash() и password_verify(), которые не чувствительны к атакам по времени.

<?php

$expected
= crypt('12345', '$2a$07$usesomesillystringforsalt$');
$correct = crypt('12345', '$2a$07$usesomesillystringforsalt$');
$incorrect = crypt('1234', '$2a$07$usesomesillystringforsalt$');

var_dump(hash_equals($expected, $correct));
var_dump(hash_equals($expected, $incorrect));

?>

Результат выполнения приведённого примера:

bool(true)
bool(false)

Метод __debugInfo()

Добавили магический метод __debugInfo(), который разрешает объектам изменять свойства и значения, которые отображаются при выводе объекта функцией var_dump().

<?php

class C
{
private
$prop;

public function
__construct($val)
{
$this->prop = $val;
}

public function
__debugInfo()
{
return [
'propSquared' => $this->prop ** 2,
];
}
}

var_dump(new C(42));

?>

Результат выполнения приведённого примера:

object(C)#1 (1) {
  ["propSquared"]=>
  int(1764)
}

Алгоритм хеширования gost-crypto

Добавили алгоритм хеширования gost-crypto. Алгоритм реализует функцию хеширования GOST, с которой работают в таблицах CryptoPro S-box, которые определяет секция 11.2 стандарта » RFC 4357.

Улучшение в протоколах SSL/TLS

В поддержку протоколов SSL/TLS в PHP 5.6 внесли широкий спектр улучшений. К улучшениям относятся: включение одноранговой проверки по умолчанию, поддержка сопоставления отпечатков сертификатов, снижение защита от атак повторного согласования по протоколу TLS и много новых параметров SSL-контекста, которые помогают точнее контролировать параметры протокола и проверки при работе с зашифрованными потоками.

Подробнее изменения описывает раздел руководства «Изменения OpenSSL в PHP 5.6.x».

Поддержка асинхронности в модуле pgsql

Модуль pgsql теперь поддерживает асинхронные соединения и запросы, чем разрешает неблокирующее взаимодействие с базами данных PostgreSQL. Асинхронные соединения разрешается устанавливать через константу PGSQL_CONNECT_ASYNC, а новые функции pg_connect_poll(), pg_socket(), pg_consume_input() и pg_flush() помогают обрабатывать асинхронные соединения и запросы.

Добавить

Примечания пользователей

Пользователи ещё не добавляли примечания для страницы
To Top