PHP — це мова сценаріїв, яка використовується великою кількістю користувачів для веб-розробки. Остання стабільна та оновлена версія PHP, 8.3, була випущена 23.11.2023. Після PHP 3.x, випущеного в 2000 році, відбулося багато інновацій і змін. PHP все ще залишається однією з найпопулярніших мов веб-розробки (веб-дизайну), якою користується дуже велика аудиторія. У цій статті ми розглянемо та проаналізуємо нововведення та зміни в PHP 8.3 на прикладах коду.
PHP 8.3 Основні нові функції та вдосконалення
Порівняно з попередньою версією PHP, PHP 8.2, у PHP 8.3 є багато основних нововведень і покращень. У той же час деякі функції застаріли. Тепер ми розглянемо інновації та вдосконалення по черзі з прикладами коду.
Типізовані константи класу
Оголошення типу є дуже важливою функцією для розробників, яка підвищує стабільність і зменшує кількість помилок у веб-розробці. Функцію оголошення типу для властивостей у класі було додано в PHP 7.4. Незважаючи на те, що в пізніших версіях цієї функції було зроблено багато покращень, ця функція все ще була недоступна для констант у класі. У PHP 8.3 тепер можна оголошувати типи констант у класах.
// Doğru kullanım:
class MyClass {
// Bildirilen tür ve değer aynı
const string VERSION = "PHP 8.3"; // değer string
}
// Hatalı kullanım:
class MyClass {
// Bildirilen tür ile değer farklı
const int VERSION = "PHP 8.3"; // değer string
}
// Hatalı kullanım:
class MyClass {
// Bildirilen tür sınıf sabitleri için desteklenmiyor
const void VERSION = "PHP 8.3"; // değer string
}Деякі оголошення типів не підтримуються для констант класу.
Непідтримувані оголошення типів для констант класу: void, callable, never
Нова функція: json_validate()
Під час роботи з даними у форматі JSON (дані, закодовані у форматі json), перед використанням нам потрібно перевірити, чи вхідні дані дійсні. Ми робили це у версіях до PHP 8.3, використовуючи наведені нижче або подібні методи.
// PHP 8.3'ten önceki sürümlerde JSON verisini doğrulama
$data = $json_decode($maybeJSON);
if (json_last_error() === JSON_ERROR_NONE) {
// $data ile gerçekleştirilecek işlemler
}У цьому старому прикладі під час перевірки даних JSON PHP може споживати значну кількість пам’яті залежно від розміру даних. У PHP 8.3 додано нову функцію PHP, яка створює швидке рішення, орієнтоване на продуктивність: json_validate(). Нижче ми навели приклад сценарію використання цієї функції.
// PHP 8.3'te JSON verisini doğrulama
$data = $json_decode($maybeJSON);
if (json_validate($maybeJSON)) {
// $data ile gerçekleştirilecek işlemler
}Нова функція: #[Перевизначити]
Під час реалізації інтерфейсів у PHP ми надаємо детальну функціональність для методів в інтерфейсі. Під час створення екземпляра класу ми можемо перевизначити батьківський метод, створивши альтернативну версію з таким самим ім’ям і сумісним підписом. Це може спричинити серйозні проблеми з програмним забезпеченням. Коротше кажучи, проблема полягає в тому, що ми вважаємо, що перевизначили основний метод через невелику помилку, яку ми не помітили.
PHP 8.3 #[Override] функція надає рішення для цієї проблеми. Тепер розглянемо це на прикладі.
class A {
protected function myOverrideFunc(): void {}
// Doğru kullanım
// Bu örnek çalışacak
// Üstteki sınıfta ilgili method var ve geçersiz kılındı
class B extends A {
#[\Override]
public function myOverrideFunc(): void {}
// Hatalı kullanım
// Bu örnek çalışmayacak, çünkü ana sınıfta method yok
// Muhtemelen gözden kaçan bir yazım hatası
class C extends A {
#[\Override]
public function myOverrideFunction(): void {}
}Глибоке клонування властивостей лише для читання
У PHP 8.1 у PHP з’явилася можливість оголошувати властивості окремих класів як тільки для читання, а в PHP 8.2 — призначати їх усьому класу. Однак більшість веб-розробників вважали, що обмеження, накладені на роботу з класами, що містять такі функції, перешкоджають практичності логіки програмування.
Щоб змінити це RFC Було зроблено дві основні рекомендації:
тільки для читання
readonlyдозвіл на заняття, які не можна продовжуватиreadonlyдозволяючи перезапускати функції під час клонування
Друга пропозиція була включена в PHP 8.3. Цей новий підхід додано до PHP 8.3 readonly екземпляри класу з властивостямиreadonly властивості) __clone Це дозволяє його перезапустити за допомогою магічного методу.
Цей приклад коду з RFC може допомогти нам зрозуміти, як працює цей новий метод:
Динамічне отримання констант класу та членів Enum
На відміну від інших функцій у PHP, захоплення констант класу та членів переліку з іменами змінних є трохи складнішим. До PHP 8.3 ми могли робити це, як у прикладі нижче:
class Foo {
public function __construct(
public readonly DateTime $bar,
public readonly DateTime $baz
) {}
public function __clone() {
// Klon çağrıldığında $bar yeni bir DateTime alacak
$this->bar = clone $this->bar;
// Ardından bu metod çağrılacak
$this->cloneBaz();
}
private function cloneBaz() {
// Bu __clone içinden çağrıldığından dolayı doğru bir kullanımdır
unset($this->baz);
}
}
$foo = new Foo(new DateTime(), new DateTime());
$foo2 = clone $foo;class MyClass {
public const THE_CONST = 9;
}
enum MyEnum: int {
case FirstMember = 9;
case SecondMember = 10;
}
$constantName = 'THE_CONST';
$memberName = 'FirstMember';
echo constant('MyClass::' . $constantName);
echo constant('MyEnum::' . #memberName)->value;Тепер давайте отримаємо значення, використовуючи визначення класу та переліку в наведеному вище прикладі в PHP 8.3:
$constantName = 'THE_CONST';
$memberName = 'FirstNumber';
echo MyClass::{$constantName};
echo MyEnum::{$memberName}->value;Новий метод: getBytesFromString()
Можна сказати, що цей метод був найнесподіванішим серед функцій, доданих у PHP 8.3: генерація випадкового тексту з використанням попередньо схваленої колекції символів.
Цей новий метод дуже простий і зрозумілий. Ми надаємо деякі символи методу як ресурси та вказуємо, скільки з них ми хочемо використовувати. От і все! Тепер наш метод повертатиме результати з випадковими символами, доки не досягне заданої довжини. Тепер давайте прояснимо це на прикладі
$generateRandomString = new Random\Randomizer();
$allowedChars = 'ABCDEFGHJKMNPQRSTVWXYZ';
$generateRandomString->getBytesFromString($allowedChars, 6) // "MBDSFD" - rastgele gelen veri
$generateRandomString->getBytesFromString($allowedChars, 6) // "DJSDKA" - rastgele gelen veri
$generateRandomString->getBytesFromString($allowedChars, 4) // "SDLA" - rastgele gelen veriВихід може бути довшим за загальну довжину символів, які ми вказали. Ми зробили це в прикладі нижче:
$generateRandomString = new Random\Randomizer();
$allowedChars = '123456';
$generateRandomString->getBytesFromString($allowedChars, 8) // "47384252" - rastgele gelen veriЯкщо всі символи, які ми надаємо як параметри, різні, ймовірність того, який із них буде обрано, однакова. Однак ми можемо змусити більше одного символу з’являтися у вихідних даних, додавши кілька однакових символів до нашого списку підтримуваних символів. Ми показали це в наступному прикладі.
$generateRandomString = new Random\Randomizer();
$allowedChars = 'AAAAA12345';
$generateRandomString->getBytesFromString($allowedChars, 5) // "4AA12" - rastgele gelen veri
$generateRandomString->getBytesFromString($allowedChars, 8) // "38A19AA5" - rastgele gelen veriНові методи: getFloat() і nextFloat()
У цьому нововведенні PHP 8.3 представляє два нові методи, які розширюють випадкове розширення PHP: getFloat() і nextFloat().
Приклад цих методів:
$generateRandomNumber = new Random\Randomizer();
// Rastgele ondalıklı (float) bir rakam oluştur
// Değer 0 ile 5 arasında olsun
$generateRandomNumber->getFloat(0,5); // 2.483929 - rastgele gelen veri
// 0 ile 1 arasında rastgele ondalıklı bir rakam oluştur
$generateRandomNumber->nextFloat(); // 0.4828258 rastgele gelen veriНезначні нововведення та вдосконалення в PHP 8.3
Крім перерахованих вище нововведень, PHP 8.3 має десятки інших невеликих поліпшень і нововведень. Ми перерахували їх разом із вихідними документами в списку нижче.
- Нові методи для класу DOMElement:
DOMElement::getAttributeNames(),DOMElement::insertAdjacentElement(),DOMElement::insertAdjacentText(),DOMElement::toggleAttribute(),DOMNode::contains(),DOMNode::getRootNode(),DOMNode::isEqualNode()DOMNameSpaceNode::contains() іMParentNode::replaceChildren(). - Нові методи для класу IntlCalendar:
IntlCalendar::setDate(),IntlCalendar::setDateTime(),IntlGregorianCalendar::createFromDate()іIntlGregorianCalendar::createFromDateTime(). - Нові функції LDAP: ldap_connect_wallet() і ldap_exop_sync().
- новий
mb_str_pad()функція багатобайтового рядка (функція багатобайтового рядка). - Нові функції POSIX:
posix_sysconf(),posix_pathconf(),posix_fpathconf()іposix_eaccess(). - Новий метод:
ReflectionMethod::createFromMethodName() - Нова функція розетки:
socket_atmark(). - Нові рядкові (текстові) функції:
str_increment(),str_decrement(), іstream_context_set_options(). - Новий метод класу ZipArchive:
ZipArchive::getArchiveFlag(). - Нове налаштування php.ini для встановлення максимально дозволеного розміру стека:
zend.max_allowed_stack_size.
Застаріло в PHP 8.3
З кожною новою версією PHP деякий код позначається як застарілий. Ніколи не рекомендується використовувати ці функції, якщо вони повністю застаріли. Якщо використовується застарілий код, під час виконання коду буде повернено повідомлення про помилку.
Список застарілих у PHP 8.3:
- Константа U_MULTIPLE_DECIMAL_SEPARATORS застаріла.
- Mt19937
3MT_RAND_PHPЦей варіант застарів. ReflectionClass::getStaticProperties()більше не може бути нульовим.- Налаштування PHP.ini
assert.active,assert.bail,assert.callback,assert.exceptionіassert.warningне підтримується. get_class()іget_parent_class()не підтримується.
PHP 8.3
У цій статті ми розглянули важливі зміни та нововведення в PHP 8.3. Для більш детального списку всіх змін у PHP 8.3 офіційний журнал змін Рекомендуємо переглянути його. Якщо ви хочете оновити свої коди або сайт із PHP 8.2 до PHP 8.3, цей посібник може бути корисним: PHP 8.3 Migration Guide -> https://www.php.net/manual/en/migration83.php
Якщо вас турбують версії PHP і міграція, ми рекомендуємо дати новій версії деякий час для оновлення до PHP 8.3.
Повне охоплення PHP і JavaScript мов і пов’язаних технологій як Onur Özden Web Çözümleri Веб-програмне забезпечення Ми пропонуємо послуги. Якщо у вас є запитання чи прохання, ви можете швидко зв’язатися з нами за допомогою кнопки Whatsapp унизу ліворуч, щоб отримати ціну.



