آشنایی با تازه های PHP 8 — از صفر تا صد
PHP 8 در تاریخ 6 آذر 1399 منتشر خواهد شد. این یک نسخه major تازه از زبان PHP است، یعنی برخی تغییرهای ناسازگار با نسخههای قبلی در آن وجود دارد و همچنین قابلیتهای زیاد جدید دیگری به همراه بهبودهای عملکردی به آن اضافه شده است. در حال حاضر PHP 8 در حالت قفل قابلیت است، یعنی هیچ قابلیت جدید دیگری نمیتواند به آن اضافه شود. این مقاله ما را در مسیر آشنایی با تازه های PHP 8 کمک میکند.
با توجه به این تغییرهای ناسازگار که اشاره کردیم، احتمال بالایی وجود دارد که نیاز باشد برخی تغییرها در کدهای موجود خود ایجاد کنید تا بتوانید آن را روی PHP 8 اجرا نمایید. با این حال اگر کد خود را به تدریج و با معرفی قابلیتهای جدید این زبان بهروزرسانی کرده باشید، این ارتقا کار دشواری نخواهد بود، چون اغلب تغییرهای ناسازگار در نسخههای پیش از *.7 منسوخ اعلام شدهاند. ما همه این موارد منسوخشده را در این مقاله فهرست خواهیم کرد.
PHP 8 علاوه بر تغییرهای ناسازگار مجموعه خوبی از قابلیتهای جدید از قبیل کامپایلر JIT، انواع Union، خصوصیتها (attributes) و موارد دیگر را عرضه کرده است.
قابلیتهای جدید PHP 8
در این بخش برخی قابلیتهای جدید را که در نسخه 8 زبان PHP اضافه شدهاند، مورد بررسی قرار میدهیم.
انواع Union
با توجه به ماهیت دینامیک انواع در زبان PHP، موارد زیادی وجود دارند که انواع Union میتوانند مفید واقع شوند. انواع Union به مجموعههایی از دو یا چند نوع گفته میشود که مشخص شده فقط یکی از این دو نوع میتواند مورد استفاده قرار گیرد.
1public function foo(Foo|Bar $input): int|float;
توجه کنید که void هرگز نمیتواند بخشی از نوع Union باشد، چون به کلی مقداری بدون نوع بازگشتی است. به علاوه یونیونهای «تهیپذیر» (nullable) را میتوان با استفاده از null یا با استفاده از نمادگذاری موجود ? نوشت:
1public function foo(Foo|null $foo): void;
2public function bar(?Bar $bar): void;
JIT
کامپایلر JIT یعنی «کامپایلر درجا» (just in time) بهبود عملکرد چشمگیری را نشان میدهد که البته همیشه در چارچوب درخواستهای وب قرار ندارد. زمانی که این نوع از کامپایلر را روی وباپلیکیشنهای واقعی تست میکنیم به نظر میرسد که کامپایلر JIT تفاوت چندانی در این نوع پروژههای PHP ایجاد نمیکند و در صورت وجود بهبود نیز چندان چشمگیر نخواهد بود.
اگر میخواهید در مورد JIT و کارهایی که در PHP انجام میدهد بیشتر بدانید، میتوانید از این مقاله (+) استفاده کنید.
عملگر nullsafe
اگر با عملگر تجمیع تهی آشنا باشید، حتماً با مشکلاتی که دارد نیز آشنا هستید. این عملگر روی فراخوانیهای متد کار نمیکند. به جای آن نیاز به بررسیهای آنی دارید یا باید روی تابعهای کمکی optional که برخی فریمورکها ارائه میکنند تکیه داشته باشید.
Optional
با اضافه شدن عملگر nullsafe به نسخه جدید PHP اینک میتوانیم رفتار شبیه تجمیع تهی را روی متدها نیز داشته باشیم. به مثال زیر توجه کنید:
1$dateAsString = $booking->getStartDate()?->asDateTimeString();
آرگومانهای نامدار
«آرگومانهای نامدار» (Named arguments) امکان ارسال مقادیر به یک تابع را با تعیین نام مقدار فراهم ساختهاند، به طوری که دیگر نیازی به توجه به ترتیب آرگومانها وجود ندارد و میتوانید پارامترهای اختیاری را نیز رد کنید.
1function foo(string $a, string $b, ?string $c = null, ?string $d = null)
2{ /* … */ }
3
4foo(
5 b: 'value b',
6 a: 'value a',
7 d: 'value d',
8);
برای کسب اطلاعات بیشتر در این مورد، میتوانید مقاله زیر را مطالعه کنید:
خصوصیتها
«خصوصیتها» (Attributes) که در زبانهای دیگر برنامهنویسی عموماً «حاشیهنویسی» (annotation) نامیده میشوند، یک روش برای افزودن فرادادهها را به کلاسها فراهم میسازند و به این ترتیب دیگر نیازی به تحلیل بلوکهای کد هم نداریم. به عنوان یک مثال مختصر در ادامه مثالی از نمای ظاهری خصوصیتها را میبینید:
1use App\Attributes\ExampleAttribute;
2
3#[ExampleAttribute]
4class Foo
5{
6 #[ExampleAttribute]
7 public const FOO = 'foo';
8
9 #[ExampleAttribute]
10 public $x;
11
12 #[ExampleAttribute]
13 public function foo(#[ExampleAttribute] $bar) { }
14}
1#[Attribute]
2class ExampleAttribute
3{
4 public $value;
5
6 public function __construct($value)
7 {
8 $this->value = $value;
9 }
10}
عبارت Match
این عبارت را میتوان برادر بزرگتر عبارت switch در نظر گرفت. Match میتواند مقادیر را بازگشت دهد و نیازی به گزارههای break هم ندارد. با بهرهگیری از این عبارت میتوانید شرطها را ترکیب کنید، از ترکیب نوع صریح استفاده کنید و هیچ نوع کاهش نوع نداشته باشید. به مثال زیر توجه کنید:
1$result = match($input) {
2 0 => "hello",
3 '1', '2', '3' => "world",
4};
ارتقای مشخصه سازنده
در نسخه جدید زبان PHP به جای اینکه مشخصههای کلاس را تعیین کرده و یک سازنده برای آنها معرفی کنیم، میتوانیم این دو را در یک بخش منفرد ترکیب کنیم. بنابراین به جای این که به صورت زیر عمل کنیم:
1class Money
2{
3 public Currency $currency;
4
5 public int $amount;
6
7 public function __construct(
8 Currency $currency,
9 int $amount,
10 ) {
11 $this->currency = $currency;
12 $this->amount = $amount;
13 }
14}
میتوانیم به صورت زیر عمل کنیم:
1class Money
2{
3 public function __construct(
4 public Currency $currency,
5 public int $amount,
6 ) {}
7}
البته در مورد ارتقای مشخصه حرفهای زیادی برای گفتن وجود دارد، اما توضیح تفصیلی در این خصوص خارج از حیطه این راهنمای مختصر است.
انواع بازگشتی جدید static
با این که قبلاً هم امکان بازگشت self وجود داشت، اما static قبل از PHP 8 یک نوع بازگشتی معتبر در این زبان نبود. با توجه به ماهیت دینامیک نوعها در PHP این قابلیتی است که برای بسیاری از توسعهدهندگان مفید خواهد بود.
1class Foo
2{
3 public function test(): static
4 {
5 return new static();
6 }
7}
نوع جدید mixed
برخی افراد این نوع جدید را در زبان PHP یک اشتباه محض میدانند. نوع mixed موجب بروز سردرگمی در افراد زیادی شده است. با این حال تعبیه این نوع در زبان PHP استدلالهای قدرتمندی دارد. این نوع جدید مفاهیم زیادی را وارد زبان PHP میکند:
- یک تابع میتواند هیچ چیز یا Null بازگشت دهد.
- میتوانیم یکی از چند نوع مختلف را انتظار داشته باشیم.
- ما میتوانیم یک نوع را انتظار داشته باشیم که دارای سرنخ نوع در PHP نباشد.
با توجه به دلایل فوق، این که نوع mixed اضافه شده است کاری خوبی محسوب میشود. mixed خودش به معنی یکی از انواع زیر است:
- array
- bool
- callable
- int
- float
- null
- object
- resource
- string
توجه کنید که mixed میتواند به صورت یک پارامتر از نوع مشخصه و نه به صورت یک نوع بازگشتی باشد.
همچنین توجه کنید که mixed خود از قبل شامل null است و امکان تهیپذیر ساختن آن وجود ندارد. بنابراین کد زیر موجب بروز خطا میشود: