آشنایی با نسخه ۸ پی اچ پی (PHP 8.0)

image

آشنایی با نسخه ۸ پی اچ پی (PHP 8.0)

ویژه گی های جدید در PHP 8

پی اچ پی ۸ یک بسته بروزرسانی کامل برای زمان برنامه نویسی php است و در پایان سال 2020 میلادی منتشر می شود . هم اکنون در حال توسعه بسیار زیاد است ، بنابراین احتمالاً تغیرات در ماه های آینده تغییر زیادی خواهد کرد و ما به تغیراتی که فعلا قطعی است اشاره می کنم با ما همراه باشید .

در این پست لیستی  از تغیراتی که انتظار می رود را اشاره خواهیم کرد : ویژگی های جدید ، بهبود عملکرد و شکستن تغییرات (تغیرات اساسی)

اگر قبلاً از آخرین نسخه های PHP استفاده کرده باشید ، سازگار شدن با آن نباید خیلی سخت باشد ، زیرا بیشترین تغییرات در نسخه های *.۷ از پیش انجام شده است.

 

علاوه بر تغیرات عمده در این نسخه آماده قابلیت های جدید JIT compiler باشید .


ویژگی های جدید پی اچ پی ۸

Union types - (انواع اتحادیه)

با توجه به نوع داینامیک بودن PHP ، موارد بسیاری وجود دارد که انواع Union types می توانند مفید باشند. انواع Union types مجموعه ای از دو یا چند نوع است که نشان می دهد که یکی از این موارد قابل استفاده است.

 

public function foo(Foo|Bar $input): int|float;

توجه داشته باشید کهvoid هرگز نمی تواند جزئی از نوع اتحادیه باشد ، زیرا این امر "هیچ مقدار برگشتی را نشان نمی دهد".

بعلاوه ، nullable می توانند با استفاده از "|" و "null" نوشته شوند ، یا با استفاده از "?" نشانه گذاری شود :

 

public function foo(Foo|null $foo): void;

public function bar(?Bar $bar): void;

آشنایی با JIT در پی اچ پی ۸

کامپایلر JIT - فقط به موقع (just in time) - وعده پیشرفت های قابل توجهی در عملکرد دارد ، البته نه همیشه در چارچوب درخواست های وب. هیچ معیار دقیقی در این مرحله فعلا انجام نشده است ، اما مطمئناً تیم توسعه PHP به نتیجه های بسیار جالبی خواهند رسید.

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


قابلیت Static return type

در حالی شما قبلا می توانستید مقدار های self و static را برگردانید اما در PHP 8 به این کار مجاز نیستید . با توجه به نوع داینامیک مقادیر در PHP ، این ویژگی که برای بسیاری از توسعه دهندگان مفید خواهد بود.

class Foo
{
    public function
test(): static
    {
        return new static();
    }
}

با استفاده ازweakrefs RFC که در PHP 7.4 اضافه شده است ، پیاده سازی WeakMap در PHP 8 نیز قابل استفاده است. WeakMaps به اشیاء اشاره دارد ، که مانع جمع آوری garbage ها نمی شود.

اگر این لایه حافظه نویسی به جای آن از منابع و weak references استفاده کند ،  هنگامی که هیچ چیز دیگری به آنها مراجعه نمی کند ، PHP این اشیاء را جمع می کند. به ویژه در مورد ORM ها ، که می توانند صدها نفر را مدیریت کنند ، اگر نه هزاران شخص موجود در یک درخواست. weak references می توانند روشی بهتر و مناسب تر برای برخورد با این اشیاء را ارائه دهند.

weak maps ، مثالی از RFC:

class Foo 
{
    private
WeakMap $cache;
 
    public function
getSomethingWithCaching(object $obj): object
    {
        return $this->cache[$obj]
           ??= $this->
computeSomethingExpensive($obj);
    }
}

objects در ::class  

یک ویژگی کوچک و در عین حال مفید ، جدید: اکنون امکان استفاده از آن وجود دارد

::class

به جای استفاده از

get_class()

استفاده می شود.  و در دقیقا همان قابلیت را دارد :

$foo = new Foo();

var_dump($foo::class);

ساختن متغیر DateTime در interface

 شما می توانید برای  استفاده از متغیر DateTime از DateTimeImmutable از 

DateTime::createFromImmutable($immutableDateTime)

استفاده کنید . همانطور که در جریان هستید راه های قبلی بسیار سختر بود :

DatetimeImmutable::createFromInterface()

ولی اکنون :‌

DateTime::createFromInterface(DateTimeInterface $other);

DateTimeImmutable::createFromInterface(DateTimeInterface $other);

 حاشیه نویسی ها برای فانکشن های داخلی

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

بررسی سینتکس های که شما در کد هایتان غافل شده اید !

RFC تمام این موارد را بررسی می کند .

سازگاری با تغیرات عمده در PHP 8

همانطور که قبلاً ذکر شد: این یک بروزرسانی اساسی است و بنابراین تغییرات بسیار اساسی به وجود خواهد آمد. بهترین کار اینست که به لیست کامل تغییرات در سند UPGRADING نگاهی بیندازید.

بسیاری از این تغییرات در نسخه های 7 انجام یافته است ، بنابراین اگر شما در طول سال ها به روز بوده اید ، ارتقاء آن به PHP 8 به این سختی نیست.

شخصی سازی ارور ها در PHP

functions برای شخصی سازی ارور های PHP که توسط کاربر از طریق throw و TypeErrors انجام می شود اما برای بعضی از از توابع داخلی که  null بر می گرداند مشکل ایجاد می کرد که این مشکل برطرف شده است .

سطح گزارش خطای پیش فرض E_ALL

اکنون برای همه چیز E_ALL به جز E_NOTICE و E_DEPRECATED است. این بدان معناست که بسیاری از خطاها ممکن است ظاهر شوند که قبلاً در سکوت نادیده گرفته شده بودند ، اگرچه احتمالاً پیش از PHP 8 وجود داشته است.

@ دیگر خطاهای مهلک را نادیده نمی گیرد !

ممکن است که این تغییر خطاهایی را که دوباره قبل از PHP 8 پنهان شده اند نشان دهد. حتماً روی سرورهای تولیدی خود display_errors=Off تنظیم کنید!

تقدم جمع بندی در PHP

اگرچه قبلاً در PHP 7.4 بهبود پیدا کرده  است ، اکنون این تغییر اعمال می شود. اگر می خواهید چیزی مثل این را بنویسید:

echo "sum: " . $a + $b;

پی اچ پی قبلاً اینگونه تفسیر می کند :

echo ("sum: " . $a) + $b;

 PHP 8 آن را به گونه ای تبدیل می کند که به صورت زیر تفسیر شود:

echo "sum: " . ($a + $b)


آپدیت : ششم اردیبهشت ۹۹

PHP 8 و Just In Time Compile

 PHP 7 در حال حاضر یک عملکرد واقعی به ارمغان آورده است.  اما PHP 8 در تلاش است تا حتی فراتر رود با ادغام کامپایلر Just In Time در هسته پی اچ پی ، توسط تیم zend 

 Just in Time Compilation راهی برای تبدیل PHP OpCode به زبان ماشین است 
 برای دستیابی به عملکردهای حتی بهتر ، مستقیماً روی پردازنده کار کنید.

 هدف از این گفتگو این است که به فناوری JIT که توسط تیم توسعه Zend Engine انتخاب شده است ، شیرجه بزنید و آن را سریعا دریابید ،
 و همچنین ارائه برخی از معیارهای اجرا در برنامه های  Symfony بسیار بهبود پیدا خواهد کرد