PHP — это язык сценариев, используемый большим количеством пользователей для целей веб-разработки. Последняя стабильная и обновленная версия PHP, 8.3, была выпущена 23.11.2023. Со времени выхода PHP 3.x, выпущенного в 2000 году, произошло много нововведений и изменений. PHP по-прежнему остается одним из самых популярных языков веб-разработки (веб-дизайна), используемых очень большой аудиторией. В этой статье мы рассмотрим и проанализируем нововведения и изменения в PHP 8.3 на примерах кода.
Основные новые функции и улучшения PHP 8.3
В PHP 8.3 имеется множество важных нововведений и улучшений по сравнению с предыдущей версией PHP, PHP 8.2. В то же время некоторые функции устарели. Теперь мы рассмотрим нововведения и улучшения одно за другим на примерах кода.
Типизированные константы класса
Объявление типа — очень важная функция для разработчиков, которая повышает стабильность и снижает частоту ошибок при веб-разработке. Функция объявления типа для свойств в классе была добавлена в 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 представил возможность объявлять отдельные свойства класса как доступные только для чтения в PHP 8.1 и назначать их всему классу в PHP 8.2. Однако большинство веб-разработчиков считали, что ограничения, налагаемые при работе с классами, содержащими такие функции, мешают практичности логики программирования.
Чтобы изменить это RFC Были даны две основные рекомендации:
только для чтения
readonlyразрешение классов, расширение которых запрещеноreadonlyразрешение перезапуска функций во время клонирования
Второе предложение было включено в PHP 8.3. Этот новый подход добавлен в PHP 8.3. readonly экземпляры класса со свойствамиreadonly свойства) __clone Это позволяет перезапустить его с помощью магического метода.
Этот пример кода из RFC может помочь нам понять, как работает этот новый метод:
Динамическая выборка констант класса и членов перечисления
В отличие от других функций 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 устарела.
- Мт19937
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 -> https://www.php.net/manual/en/migration83.php
Если вас беспокоят версии PHP и миграция, мы рекомендуем дать новой версии некоторое время для обновления до PHP 8.3.
Полный охват языков PHP и JavaScript и связанных с ними технологий как Onur Özden Web Çözümleri Веб-программное обеспечение Мы предлагаем услуги. Если у вас есть вопрос или запрос, вы можете быстро связаться с нами через кнопку WhatsApp в левом нижнем углу, чтобы получить ценовое предложение.



