پی اچ پی (PHP) 8.5 در راه است! - بررسی تغییرات جدید

به‌عنوان توسعه‌دهندگان PHP، ما در چند سال گذشته شاهد یک تحول فوق‌العاده بوده‌ایم. از انقلاب عملکردی PHP 7 گرفته تا قابلیت‌های Union Types و Attributes در PHP 8، هر نسخه ویژگی‌هایی را به همراه داشته که واقعاً کار روزمره ما را بهتر کرده است. PHP 8.5 هم این روند را ادامه می‌دهد، اما با تمرکزی متفاوت — این بار کمتر به تغییرات بزرگ و پارادایمی می‌پردازد و بیشتر بر آن لحظات «بالاخره!» که همه تجربه کرده‌ایم تمرکز دارد.

حتماً آن زمان‌هایی را به یاد دارید که حین کدنویسی با خود می‌گویید: «حتماً باید راه تمیزتری برای انجام این کار وجود داشته باشد»؟ یا وقتی با یک خطای Fatal مواجه می‌شوید و زمان زیادی را صرف پیدا کردن تابعی در Stack می‌کنید که باعثش شده است؟ PHP 8.5 بسیاری از این مشکلات روزمره را با افزودن قابلیت‌هایی برطرف می‌کند که انگار از همان ابتدا باید وجود می‌داشتند.

این نسخه به‌خصوص هیجان‌انگیز است چون نشان می‌دهد تیم PHP با دقت به بازخورد جامعه گوش می‌دهد. به‌عنوان مثال، Pipe Operator که مدت‌هاست یکی از درخواست‌های جامعه بوده و از زبان‌های برنامه‌نویسی تابعی الهام گرفته شده است. همچنین، Stack Trace برای خطاهای Fatal یک مشکل آزاردهنده در دیباگ را که سال‌ها وجود داشت حل می‌کند.

در ادامه، نگاهی می‌اندازیم به قابلیت‌های جدید PHP 8.5 که باعث افزایش سرعت توسعه شما در اپلیکیشن ها میشه.


The Pipe Operator

شاید چشمگیرترین قابلیت جدید، عملگر Pipe (|>) باشد که به شما اجازه می‌دهد فراخوانی توابع را به شکلی خواناتر و از چپ به راست زنجیره کنید. اگر قبلاً با زبان‌هایی مثل F# یا Elixir کار کرده باشید، این ویژگی برایتان آشنا خواهد بود، و اگر نه، آماده یک تجربه جذاب باشید.

به جای استفاده از توابع تو در تو یا تعریف متغیرهای میانی متعدد، حالا می‌توانید به این صورت بنویسید:

$message = "Welcome Back"
    |> strtolower(...)
    |> trim(...)
    |> ucfirst(...);

// Result: "Welcome back"

این روش نسبت به شیوه سنتی و تو در تو بسیار خواناتر است:

$message = ucfirst(trim(strtolower("Welcome Back")));

عملگر Pipe با هر نوع Callable کار می‌کند — شامل توابع، متدها، Closureها و حتی کلاس‌هایی که متد __invoke دارند.

با این حال، عملگر Pipe یک سری محدودیت‌های مهم دارد که باید به آن‌ها توجه کنید:

  • هر تابع در زنجیره باید فقط یک پارامتر ضروری داشته باشد (مقدار ارسال‌شده از Pipe به‌عنوان آرگومان اول قرار می‌گیرد).

  • توابعی که پارامتر By-Reference دارند پشتیبانی نمی‌شوند (چون در اینجا متغیر واقعی برای ارجاع وجود ندارد).


Better Error Debugging with Stack Traces

PHP 8.5 بالاخره Stack Trace را به خطاهای Fatal اضافه کرده است که دیباگ کردن را بسیار ساده‌تر می‌کند.

قبلاً وقتی اسکریپت شما با خطای Fatal (مثل تمام شدن حافظه) مواجه می‌شد، فقط پیام خطا و شماره خط را می‌دیدید. اما حالا می‌توانید کل Call Stack را مشاهده کنید:

Fatal error: Allowed memory size exhausted in script.php on line 8
Stack trace:
#0 script.php(12): process_large_data()
#1 script.php(20): handle_request()
#2 {main}

این قابلیت توسط دستور جدید fatal_error_backtraces در INI کنترل می‌شود و به‌صورت پیش‌فرض فعال است.


New Array Convenience Functions

دو تابع ساده اما کاربردی به مجموعه ابزار آرایه‌ای PHP اضافه شده‌اند و شکافی را که توسعه‌دهندگان سال‌ها برایش راه‌حل‌های جایگزین پیدا می‌کردند، پر می‌کنند.

در حالی که PHP 7.3 توابع array_key_first() و array_key_last() را برای گرفتن کلیدها معرفی کرد، برای دسترسی به مقادیر همچنان نیاز به مراحل اضافی بود:

$fruits = ['apple', 'banana', 'cherry'];
$first = array_first($fruits);  // 'apple'
$last = array_last($fruits);    // 'cherry'

// Works with associative arrays too
$scores = ['alice' => 95, 'bob' => 87, 'charlie' => 92];
$first_score = array_first($scores);  // 95
$last_score = array_last($scores);    // 92

قبل از PHP 8.5، برای گرفتن اولین مقدار از یک آرایه معمولاً باید از reset($array) یا array_values($array)[0] استفاده می‌کردید که هم کمی دست‌وپاگیر بودند و هم برای توسعه‌دهندگان دیگر که کد شما را می‌خوانند بلافاصله واضح نبودند.

توابع جدید این موضوع را کاملاً شفاف می‌کنند.

یک نکته مهم: هر دو تابع برای آرایه‌های خالی مقدار null برمی‌گردانند، اما از آنجایی که null می‌تواند یک مقدار معتبر در آرایه هم باشد، در بعضی موارد ممکن است نیاز به بررسی‌های اضافه داشته باشید:

$data = [null, 'second', 'third'];
$first = array_first($data);  // null (valid value)

$empty = [];
$first = array_first($empty); // null (empty array)

// If you need to distinguish between these cases
if (empty($data)) {
    // Array is actually empty
} elseif (array_first($data) === null) {
    // First value is null
}

این توابع مکمل array_key_first() و array_key_last() که در PHP 7.3 معرفی شدند هستند و به شما امکان می‌دهند بدون هیچ پیچیدگی ذهنی، به هر دو انتهای آرایه‌های خود (چه کلید و چه مقدار) به‌طور کامل دسترسی داشته باشید.


Handler Introspection Functions

PHP 8.5 توابع جدید get_error_handler() و get_exception_handler() را معرفی کرده است که به شما امکان می‌دهد هندلرهای خطا و استثنا (Exception) فعلی تنظیم‌شده را دریافت کنید.

این ویژگی شکاف قبلی را پر می‌کند، چون قبلاً می‌توانستید هندلرها را تنظیم و بازیابی کنید اما به‌راحتی نمی‌توانستید بفهمید کدام هندلرها در حال حاضر فعال هستند:

set_error_handler('my_error_handler');
$current_handler = get_error_handler(); // Returns 'my_error_handler'

if (get_exception_handler() === null) {
    // No exception handler is currently set
    set_exception_handler('my_exception_handler');
}


Internationalization Features

افزونه Intl چند بهبود جدید دریافت کرده است. تابع جدید locale_is_right_to_left() (و متد متناظر آن Locale::isRightToLeft()) به شما کمک می‌کند تا بفهمید آیا یک locale از اسکریپت‌های راست‌به‌چپ استفاده می‌کند یا خیر:

locale_is_right_to_left('en-US');  // false
locale_is_right_to_left('ar-SA');  // true
locale_is_right_to_left('he-IL');  // true

همچنین یک کلاس جدید به نام IntlListFormatter اضافه شده است که برای ساخت لیست‌های سازگار با locale به کار می‌رود:

$formatter = new IntlListFormatter('en-US');
echo $formatter->format(['Paris', 'London', 'Tokyo']);
// "Paris, London, and Tokyo"

$formatter = new IntlListFormatter('de-DE');
echo $formatter->format(['Paris', 'London', 'Tokyo']);
// "Paris, London und Tokyo"


cURL Enhancement

برای کسانی که با cURL multi-handle کار می‌کنند، تابع جدید curl_multi_get_handles() تمام handleهای مرتبط با یک multi-handle را برمی‌گرداند و دیگر نیازی به پیگیری دستی آن‌ها نیست:

$multi = curl_multi_init();
$handle1 = curl_init('https://api.example.com/users');
$handle2 = curl_init('https://api.example.com/posts');

curl_multi_add_handle($multi, $handle1);
curl_multi_add_handle($multi, $handle2);

$all_handles = curl_multi_get_handles($multi);
// Returns [$handle1, $handle2]


نگاهی به آینده پی اچ پی

PHP 8.5 روند تکامل زبان را در جهت نوشتار بیان‌گرتر و دوست‌دار توسعه‌دهنده ادامه می‌دهد، در حالی که سازگاری با نسخه‌های قبلی را حفظ می‌کند. به‌ویژه عملگر Pipe گامی مهم به سمت الگوهای برنامه‌نویسی تابعی است که بسیاری از توسعه‌دهندگان مدت‌ها درخواستش را داشتند.

این قابلیت‌ها در مجموع کدهای PHP را خواناتر، فرایند دیباگ را مفیدتر و توسعه بین‌المللی را آسان‌تر می‌کنند. هرچند هیچ‌کدام به تنهایی انقلاب‌برانگیز نیستند، اما کنار هم بهبودهای قابل توجهی در کیفیت زندگی برنامه‌نویسان PHP در سراسر جهان به حساب می‌آیند.

شخصاً بی‌صبرانه منتظرم PHP 8.5 منتشر شود تا این ویژگی‌ها را امتحان کنم!

0 🔥
0 🎉
0 😮
1 👍
0 💜
0 👏
میلاد خسروی
نویسنده کد نیوز

برنامه نویس فان | Fun Developer یک آدم ساده که عاشق برنامه نویسی و کد زدنه :) تلاش میکنه تا به بقیه کمک کنه. توسعه دهنده هسته لاراول و فضای اوپن سورس. فاندر پرانتز و کد نیوز.

0+ نظر

برای ثبت نظر ابتدا ورود کنید.

0 نظر

    اولین نفر باش که نظر ثبت میکنی :) یعنی یه کامنت به ما نمیرسه 😁