Що нового у PHP 8.2
Після року розробки представлений реліз мови програмування PHP 8.2. Нова гілка включає серію нових можливостей, а також кілька змін, що порушують Сумісність.
Ключові зміни в PHP 8.2:
- Порівняння на оф. сайті 8.1
- Порівняння на оф. сайті 8.2
Додана можливість позначки класу доступним тільки для читання. Властивості в подібних класах можуть бути задані тільки один раз, після чого не будуть доступні для зміни. Раніше тільки для читання могли позначатися окремі властивості класу, А тепер разом можна включити даний режим для всіх властивостей класу. Вказівка прапора" readonly " на рівні класу також блокує динамічне додавання властивостей до класу.
readonly class Post
{
public function __construct(
public string $title,
public Author $author,
) {}
}
$post = new Post(/* … */);
$post->unknown = 'wrong'; // Error: Cannot create dynamic property Post::$unknown
Додані окремі типи "true", "false" і "null", які можуть приймати тільки одне допустиме значення і використовуватися, наприклад, для повернення функцією ознаки завершення з помилкою або порожнього значення. Раніше "true"," false "і" null "могли використовуватися тільки в зв'язці з іншими типами (наприклад, "string / false"), а тепер можуть застосовуватися окремо:
function alwaysFalse(): false
{
return false;
}
Надана можливість фільтрації конфіденційних параметрів в даних трасування стека, що виводяться під час помилки. Вирізання певної інформації може знадобитися коли відомості про виникаючі помилки автоматично направляються в сторонні сервіси, що відстежують проблеми і інформують про них розробників. Наприклад, можна виключити з трасування параметри, що включають імена користувачів, паролі і змінні оточення.
function test(
$foo,
#[\SensitiveParameter] $password,
$baz
) {
throw new Exception('Error');
}
test('foo', 'password', 'baz');
Fatal error: Uncaught Exception: Error in test.php:8
Stack trace:
#0 test.php(11): test('foo', Object(SensitiveParameterValue), 'baz')
#1 {main}
thrown in test.php on line 8
Дозволено визначення констант в типажах (trait, механізм для повторного використання коду). Доступ до констант, визначених у типажі, можна отримати через клас, який використовує типаж (але не через ім'я типу).
trait Foo
{
public const CONSTANT = 1;
public function bar(): int
{
return self::CONSTANT; // Fatal error
}
}
class Bar
{
use Foo;
}
var_dump(Bar::CONSTANT); // 1
Додана можливість завдання типів в диз'юнктивної нормальної формі (dnf, Disjunctive Normal Form), що дозволяє поєднати об'єднання типів (колекції з двох і більше типів) і перетин типів (типи, значення яких підпадають одночасно під кілька типів).
class Foo {
public function bar((A&B)|null $entity) {
if ($entity === null) {
return null;
}
return $entity;
}
}
Запропоновано нове розширення "Random" C функціями і класами для генерації псевдовипадкових чисел і послідовностей. Модуль надає об'єктно-орієнтований інтерфейс, дозволяє вибирати різні движки для генерації псевдовипадкових чисел, в тому числі придатні для застосування в криптографії, і надає допоміжні функції, наприклад, для випадкового перемішування масивів і рядків, вибору випадкових ключів масиву, одночасного використання декількох генераторів зі своїм незалежним станом.
$rng = $is_production
? new Random\Engine\Secure()
: new Random\Engine\Mt19937(1234);
$randomizer = new Random\Randomizer($rng);
$randomizer->shuffleString('foobar');
Реалізовано незалежне від локалі перетворення регістру символів. Функції, подібні strtolower () і strtoupper (), тепер завжди перетворюють регістр символів в діапазоні ASCII як при виставленні локалі "з".
Додані нові функції: mysqli_execute_query, curl_upkeep, memory_reset_peak_usage, ini_parse_quantity, libxml_get_external_entity_loader, sodium_crypto_stream_xchacha20_xor_ic, openssl_cipher_key_length.
Додані нові методи: mysqli::execute_query, ZipArchive::getStreamIndex, ZipArchive::getStreamName, ZipArchive::clearError, ReflectionFunction::isAnonymous, ReflectionMethod:: hasPrototype.
Оголошена застарілою можливість динамічного створення властивостей в класі. У PHP 9.0 звернення до властивостей, спочатку не визначеним в класі, буде призводити до помилки (ErrorException). Класи, що надають методи __get і _ _ set для створення властивостей, або динамічні властивості в stdClass продовжать працювати без змін, припиниться підтримка тільки неявної роботи з неіснуючими властивостями для того щоб захистити розробника від прихованих помилок. Для збереження роботи старого коду запропоновано атрибут " #[AllowDynamicProperties]", що дозволяє використання динамічних властивостей.
Оголошена застарілою можливість підстановки значень змінних в рядки за допомогою виразів "${var}" і ${(var)}". Підтримка зазвичай використовуваних підстановок " {$var}" і "$var " збережена. Наприклад:
"Hello {$world}"; OK
"Hello $world"; OK
"Hello ${world}"; Deprecated: Using ${} in strings is deprecated
Оголошені застарілими частково підтримувані об'єкти, що викликаються (callable), які можуть бути викликані через " call_user_func ($callable)", але не підтримують виклик у формі"$callable ()":
"self::method"
"parent::method"
"static::method"
["self", "method"]
["parent", "method"]
["static", "method"]
["Foo", "Bar::method"]
[new Foo, "Bar::method"]
У Налаштування додана директива error_log_mode, що дозволяє визначити режим доступу до логу з помилками.