ویژگیهای جدید PHP 8.0
جدیدترین نسخه زبان برنامهنویسی PHP، نسخه 8.0 PHP در 26 نوامبر 2020 منتشر شد. PHP 8.0 باقابلیتهای جدید و هیجانانگیزی عرضه شد که برنامه نویسان و توسعهدهندگان وب را به آینده PHP، بیشازپیش امیدوار کرد. این تغییرات و ویژگیهای جدید بسیاری از ضعفهای نسخههای قبلی را برطرف کرده و عملکرد آن را تا حد مطلوبی بهبود میبخشند. Union types, Match Expression, JIT Compiler, Attributes, Nullsafe Operator و چند تابع عملکرد جدید جزو قابلیتهای جدید اضافهشده به PHP 8.0 هستند. شما میتوانید لیست کامل تغییرات PHP 8 را در [link] مشاهده نمایید. [https://www.php.net/ChangeLog-8.php] در این مقاله با مهمترین بهروزرسانیهای PHP 8.0 آشنا میشویم تا بتوانیم از آنها برای نوشتن بهتر کدها استفاده کنیم.
کامپایلر JIT
میتوان با قطعیت کامپایلر JIT را جنجالیترین بهروزرسانی PHP 8 معرفی کرد. JIT بهجای اینکه کدها را کامپایل و سپس اجرا کند، کدها را در لحظه اجرا (runtime) پردازش کرده و به زبان قابلفهم برای ماشین تبدیل مینماید. این کامپایلر با پردازش Real Time نیاز به استفاده از مترجم را برطرف میکند. این امر سرعت پردازش را افزایش داده و باعث بهبود عملکرد میشود اما به دلیل تفاوتهای موجود بین کد نویسی در حالت عمومی و دنیای وب، تأثیر این کامپایلر، بهصورت مستقیم در پروژههای PHP مشاهده نمیشود. بااینکه تأثیر این کامپایلر، در دنیای وب چندان قابلمشاهده نیست اما احتمال رشد و بهبود PHP را -چه بهعنوان یکزبان برنامهنویسی وب و چه بهعنوان یکزبان برنامهنویسی عمومی- بیشتر میکند. علاوه بر این موارد، کامپایلر JIT برخلاف یک کامپایلر معمولی، میتواند به اطلاعات داینامیک در حین اجرا (runtime) دسترسی داشته باشد.
برای آشنایی کامل با ماهیت و نحوه عملکرد JIT، به مقاله [JIT در PHP 8/ بهزودی تکمیل میشود] مراجعه کنید.
کامپایلر JIT بهصورت پیشفرض در PHP 8 فعال است اما اگر بخواهید آن را غیرفعال کنید میتوانید در کد زیر بهجای 100 مگابایت، مقدار 0 را وارد کنید.
opcache.jit_buffer_size=100M
Union Types
ویژگیها و قابلیتهای PHP 8 همانطور که گفتهشده بود، باعث بهبود عملکرد و رفع خطاهای ورژن های قبلی شد. یکی از این ویژگیهای جالب، Union Types است که به شما اجازه میدهد تا Type های مختلفی برای توابع، متدها یا متغیرها تعریف کنید. در ورژن های قبلی، نوع فایل (یا متد) ورودی و خروجی، نمیتوانستند متفاوت باشند.
مثلاً در نسخههای قبل، برای ورودی .int خروجی هم باید حتماً از نوع .int بود اما اکنون با استفاده از ویژگی union types میتوانیم یک پارامتر یا خروجی متد/تابع را از نوع .int یا از نوع .float تعریف کنیم:
public function foo(Foo|Bar $input): int|float
در این کد، برای پارامتر ورودی دو نوع FOO و یا Bar و در خروجی هم به همین صورت، دو نوع int و یا float را برای تابع تعریف کردهایم.
لازم است توجه کنیم که توابع نوع void دارای خروجی نیستند پس نمیتوان Union type را برای آنها به کار برد. همچنین اگر بخواهیم نوع خروجی یک تابع را از نوع nullable تعریف کنیم، از علامت سؤال یا null| استفاده میکنیم.
public function foo(Foo|null $foo): void;public function bar(?Bar $bar): void;
Attributes V2
ورژن دوم Attributes در PHP 8 معرفی میشود که PHP را بیشتر از قبل، همرده زبانهای دیگر مینماید. Attributes به شما اجازه میدهد تا مستقیماً برای کلاسها، متدها، پراپرتی ها و ثابتها metadata اضافه کنید. در نسخههای پیشین، برای این کار در حین کد نویسی، از عملگر ‘doc_comments’ استفاده میشد.
تفاوتهای attributes و doc_comments:
- Doc_comments هیچ ساختار نداشتند و فقط رشته (string) های ساده بودند.
- Doc_commentsبهطور خودکار تجزیه و پردازش نمیشدند.
- میتوانید بیش از یک attribute برای هر declaration تعریف کنید و هر attributeمیتواند یک یا چند مقدار (value) داشته باشد.
<>
<<SingleArgument(0)>>
<<FewArguments('Hello', 'World')>>
function foo() {}
بازگردانی مقادیر static
در نسخههای قبلی PHP قابلیت return مقادیر self و static وجود داشت اما در PHP 8 این قابلیت موجود نیست. با در نظر گرفتن اینکه مقادیر PHP داینامیک هستند، میتوان گفت این امر برای توسعهدهندگان وب نکته مثبتی بهحساب میرود. در PHP 8 میتوانیم به کمک کد زیر، خروجی یک تابع/ متد را از نوع static تعریف کنیم:
class Watch
{
public function hour(): static
{
return new static();
}
}
تقدم جمعبندی در PHP
در PHP 8، عملیات جمعکردن دو متغیر، دستخوش تغییراتی در اولویتبندی شده است. با یک مثال به توضیح این مورد میپردازیم. برای مثال فرض کنید شما کد را به شکل زیر وارد نمودهاید:
echo "sum: ". $a + $b;
این کد در نسخههای قبلی به شکل زیر تفسیر میشد:
echo ("sum: ". $a) + $b;
اما در نسخه کنونی، این کد بهصورت زیر تفسیر میشود:
echo "sum: ". ($a + $b)
اپراتور Nullsafe
اگر در نسخه 7 PHP با اپراتور Null coalescing کارکردهاید، حتماً میدانید که این اپراتور نمیتواند برای متدهایی که فقط یک آبجکت دارند، عمل کند. در صورت استفاده از این عملگر برای متدهای دارای یک آبجکت، با یک خطا تحت عنوان «this method is not defined!» روبرو خواهید شد. در PHP 8 با استفاده از کد زیر، میتوان این مشکل را با اپراتور Nullsafe برطرف کرد:
$obj = new stdClass;
echo $obj?->foo()?->bar()?->baz(); // null
همانطور که مشاهده میکنید، کد عملگر Nullsafe در نسخه 8 بسیار کوتاهتر از نسخه 7 بوده و خطای «متد تعریفنشده» را نیز برطرف میکند.
Match Expression
نسخه پیشرفته عملگر switch، بانام Match Expression در 8 PHP معرفیشده است. این عملگر قدرتمند، میتواند مقادیر (values) را بازگرداند و نیازی به استفاده از breaks ندارید. عملکرد کلی match expression و switch یکسان است اما Match Expression ظاهری بهتر و کد خواناتری دارد. در جدول زیر، با یک مثال، میتوانید ساختار این دو اپراتور را باهم مقایسه نمایید:
switch |
Match Expression V2 |
switch (1) { case 0: $result = 'Foo'; break; case 1: $result = 'Bar'; break; case 2: $result = 'Baz'; break; } echo $result; //> Bar |
echo match (1) { 0 => 'Foo', 1 => 'Bar', 2 => 'Baz', }; //> Bar
|
Named Arguments
استفاده از اپراتور جدید Named Arguments کد شمارا خواناتر و قابلدرکتر برای ماشین مینماید. با استفاده از این عملگر شما میتوانید از مقادیر پیشفرض چشمپوشی کرده و رد شوید. Named Arguments روش جدیدی برای انتقال آرگومانها از یک تابع PHP به تابع دیگر برایتان فراهم میکند.
کاربردهای Named Arguments گستردهاند که در اینجا به شرح چند مورد میپردازیم.
۱- اگر نام یک پارامتر را پیش از مقدار آن اضافه کنید، میتوانید آن پارامتر را به یک تابع منتقل نمایید. به کد زیر توجه کنید:
callFunction(name: $value);
۲- با استفاده از اپراتور Named Arguments میتوانید از reserved keywords استفاده کنید؛ به مثال زیر توجه کنید:
callFunction(array: $value);
۳- بر اساس این ویژگی، میتوانیم پارامترهای یک تابع را بدون ترتیب هم مقداردهی کنیم و اجباری به مقداردهی همه پارامترها به ترتیب تعریفشده نیست. به مثال زیر توجه نمایید:
function foo(string $a, string $b,?string $c = null,?string $d = null) { /* … */ } foo(b: 'value b', a: 'value a', d: 'value d',);
توابع جدید
در PHP 8.0 چند تابع جدید تعریفشدهاند که استفاده از آنها میتواند به شما در نوشتن کد بهتر کمک کنند.
توابع Str_starts_with و Str_ends_with
اگر میخواهید رشتههایی را (strings) که با عبارت یا مقدار خاصی آغاز میشوند یا به پایان میرسند، پیدا کنید، توابع str_starts_with و str_ends_with میتوانند نتیجه مطلوب را برایتان نمایش دهند.
str_starts_with (string $haystack, string $needle): bool
str_ends_with (string $haystack, string $needle): bool
تابع Str_contains
دستورهای strstr و strpos در نسخههای پیشین PHP برای پیدا کردن مقدار (value) به خصوصی کاربرد داشتند. استفاده از این دستورها میتوانست برنامهنویسها را سردرگم کند؛ چراکه معمولاً نتایج نمایش دادهشده کاملاً صحیح نبودند. در نسخه 8 با یک تابع جدید به نام str_contains آشنا میشویم که میتواند با دقت بالا، وجود یا عدم وجود یک مقدار را در رشته مشخص کند.
str_contains (string $haystack, string $needle): bool
Get_debug_type
تابع gettype را از نسخههای پیشین به یاد دارید؟ تابع get_debug_type عملکردی مشابه این تابع با تفاوتهایی جزئی دارد. get_debug_type همانند gettype نوع متغیرها را برمیگرداند اما پیشرفتهای خوبی در عملکرد آن ایجادشده و برای type checking بسیار کاربردی است.
if (!($bar instanceof Foo)) {
throw new TypeError('Expected '. Foo::class. ' got '. get_debug_type($bar));
}
جمع بندی
قابلیتهای جدید PHP 8 در موارد ذکرشده خلاصه نمیشوند و ابزارها و ویژگیهای جدید جذاب بسیاری برای این نسخه تعریفشدهاند. میتوان گفت کامپایلر JIT مهمترین و مورد انتظارترین ویژگی نسخه 8 پی اچ پی بود که نقطه پیشرفت جدیدی برای این زبان برنامهنویسی رقم میزند. گروه توسعهدهنده PHP باهدف تبدیل این زبان به سریعترین زبان برنامهنویسی سمت سرور جهان، قابلیتهای جدید و پیشرفته را به PHP 8 افزودهاند. همه این عوامل دستبهدست هم میدهند تا نسخه ۸ پی اچ پی را انتخاب مناسبی برای برنامه نویسان و توسعهدهندگان وب نمایند.
اگر از قابلیتها و ویژگیهای جدید PHP 8 استفاده کردهاید، تجربیات خود را با ما به اشتراک بگذارید.
[rpost]