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
}

یک ویژگی جدید: #[Override]

هنگام پیاده سازی اینترفیس ها در 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 دو توصیه اصلی ارائه شد:

فقط خواندنی

  1. readonly اجازه می دهد کلاس هایی که مجاز به تمدید نیستند
  2. readonly اجازه می دهد تا ویژگی ها در طول شبیه سازی مجدد راه اندازی شوند

پیشنهاد دوم در PHP 8.3 گنجانده شد. این رویکرد جدید به PHP 8.3 اضافه شده است readonly نمونه هایی از یک کلاس با ویژگی هاreadonly خواص) __clone این اجازه می دهد تا با روش جادویی خود دوباره راه اندازی شود.

این مثال کد از RFC می تواند به ما در درک نحوه کار این روش جدید کمک کند:

واکشی پویا ثابت‌های کلاس و تعداد اعضا

برخلاف سایر ویژگی‌های PHP، گرفتن ثابت‌های کلاس و اعضای enum با نام متغیرها کمی پیچیده‌تر است. قبل از 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;

اکنون، بیایید مقادیر را با استفاده از تعاریف کلاس و enum در مثال بالا در 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 دارای ده ها پیشرفت و نوآوری در مقیاس کوچک دیگر است. ما آنها را همراه با اسناد منبع آنها در لیست زیر فهرست کرده ایم.

منسوخ شده در PHP 8.3

با هر نسخه جدید PHP، برخی از کدها برای منسوخ شدن علامت گذاری می شوند. استفاده از این ویژگی ها پس از منسوخ شدن کامل هرگز توصیه نمی شود. در صورت استفاده از کد منسوخ شده، هنگام اجرای کد، پیغام خطا برگردانده می شود.

لیست منسوخ شدن در PHP 8.3:

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 نرم افزار وب ما خدمات ارائه می دهیم.  اگر سوال یا درخواستی دارید، می توانید به سرعت از طریق دکمه واتساپ در پایین سمت چپ با ما تماس بگیرید تا قیمت را دریافت کنید.