Что нового в PHP 8.6
PHP 8.6 возможно выйдет в конце ноября 2026 года, а мы пока в этом посте будем рассматривать все RFC, которые будут появляться в течение этого года, по мере их рассмотрения и принятия.
Новый функционал
Сообщение об ошибке/исключении в json_decode теперь указывает место возникновения ошибки
До PHP 8.6 в json_decode и json_last_error_msg сообщения об ошибках содержали тип ошибки и описание, но не указывали точное место возникновения ошибки при её анализе. Начиная с PHP 8.6, все ошибки декодирования JSON пытаются включить в строку JSON местоположение, где произошла ошибка:
$json = '[{';
json_decode($json, flags: JSON_THROW_ON_ERROR);
// JsonException: Syntax error near location 1:3$json = '[{';
try {
json_decode($json, flags: JSON_THROW_ON_ERROR);
}
catch (JsonException $ex) {
echo $ex->getMessage(); // "Syntax error near location 1:3"
}json_decode('[[[[[[[[[[42]]]]]]]]]]', depth: 6);
json_last_error_msg(); // "Maximum stack depth exceeded near location 1:6"Новая функция clamp
В PHP 8.6 появилась новая функция clamp, которая проверяет, находится ли заданное значение в пределах заданного диапазона. Если значение находится в пределах этого диапазона, возвращается исходное значение. Если оно выходит за пределы диапазона, clamp возвращается ближайший предел:
clamp(5, 0, 100); // 5
clamp(0, 0, 100); // 0
clamp(-5, 0, 100); // 0
clamp(100, 0, 100); // 100
clamp(105, 0, 100); // 100
clamp(105, 100, 100); // 100
clamp(3.01, 1.6, 4.2); // 3.01
clamp(10.0, 1.6, 4.2); // 4.2
clamp(0, M_1_PI, M_2_PI); // 0.31830988618379
clamp(5, 10, 12.5); // 10
clamp(5, 10.0, 12); // 10.0
clamp(3.14, 10, 20); // 10
clamp(3.14, 0, 20); // 3.14Readonly свойства по-умолчанию
С добавлением хуков свойств в PHP 8.4 вы можете определять хуки свойств для интерфейсов:
interface MigratesUp
{
public string $name { get; }
public function up(): QueryStatement;
}Во многих случаях будет целесообразно использовать свойства только для чтения со значениями по умолчанию:
final class CreateBooksTable implements MigratesUp
{
public readonly string $name = '2026-01-01_create_books_table';
public function up(): QueryStatement
{ /* … */ }
}Но до PHP 8.6 нельзя было присваивать значения по умолчанию свойствам, доступным только для чтения. Это было преднамеренным дизайнерским решением при добавлении свойств, доступных только для чтения, поскольку такое свойство со значением по умолчанию по сути является константой. Конечно, это было до того, как в интерфейсах появилась возможность определять обработчики свойств, поскольку теперь значение по умолчанию, которое нельзя изменить, имеет смысл, если оно является частью более крупного контракта. То есть теперь можно делать вот так:
final class CreateBooksTable implements MigratesUp
{
// ✅
public readonly string $name = '2026-01-01_create_books_table';
// …
}более подробно в статье здесь.


pavbk14.06.2026
Будем надеяться что появится async await