تغییرات PHP 8.4

تغییرات PHP 8.4
زمان مطالعه: 5 دقیقه

PHP 8.4 جدیدترین نسخه منتشر شده از زبان برنامه‌نویس PHP است که در تاریخ ۲۱ نوامبر ۲۰۲۴ (به شمسی ۲۱ آذر ۱۴۰۳) منتشر شد. PHP یک زبان برنامه‌نویسی همه منظوره محبوب است که مخصوصاً برای طرحی صفحات وب  توسعه یافته‌است. تا ژانویهٔ سال ۲۰۱۳ میلادی (به شمسی دی‌ماه ۱۳۹۱)، پی‌اچ‌پی روی ۲۴۴ میلیون وبگاه و ۲٫۱ میلیون سرور وب نصب شده‌است. محبوبیت PHP اینقدر زیاد است که در سال ۲۰۲۳، پی اچ پی پرکاربردترین و محبوب ترین زبان برنامه نویسی سمت سرور است که به طور کلی تقریبا ۷۷ درصد از سهم بازار را به خود اختصاص داده است.

ویژگی‌های جدید

phpinfo

از نسخه PHP 8.4 به بعد تابع خروجی تابع  phpinfo() مقدار سایز عددی پشتیبانی شده توسط پی اچ پی را نمایش می‌دهد.

همچنین این تغییرات در نسخه PHP CLI نیز اضافه شده است.

Zend Extension => 420230901
Zend Extension Build => API420230901,TS,VS16
PHP Extension Build => API20230901,TS,VS16
+ PHP Integer Size => 64 bits

پیاده‌سازی تغییرات بالا را می‌توانید در این کامیت مشاهده کنید.

 

توابع کمک‌کننده آرایه

این توابع که به عنوان array helper در PHP 8.4 اضافه شده‌اند انجام کارهای رایج مانند جستجو و بررسی آرایه‌ها را بدون نیاز به نوشتن کد تکراری آسان‌تر کرده‌اند. همچنین آنها بسیار شبیه به توابع موجود در زبان‌های برنامه‌نویسی دیگری مانند Rust، JavaScript و C++ هستند که PHP را برای توسعه‌دهندگانی که با این زبان‌ها آشنا هستند، چندمنظوره‌تر و استفاده از آن را آسان‌تر می‌کند.

array_find

این تابع به شما کمک می‌کند تا اولین عنصر در یک آرایه را که با یک شرط خاص مطابقت دارد پیدا کنید. این تابع مشابه array_filter است، اما به جای فیلتر کردن تمام عناصر مطابقت‌دار، در اولین مورد متوقف می‌شود. به مثال زیر توجه کنید:

$array = ['a' => 'Tehran', 'b' => 'Tabriz', 'c' => 'Mashhad', 'd' => 'Shiraz'];

// اولین شهری که اسم بیش از ۶ کارکتر دارد را پیدا کن
$result = array_find($array, function ($value) {
    return strlen($value) > 6;
});

var_dump($result); // string(7) "Mashhad"

اگر هیچ عنصر مطابقت‌داری پیدا نشود، array_find مقدار null را برمی‌گرداند.

RFC ‌مربوط به array_find

array_find_key

این تابع شبیه به array_find است، اما به جای بازگرداندن مقدار المنت، کلید آن را برمی‌گرداند.

$array = ['a' => 'Tehran', 'b' => 'Tabriz', 'c' => 'Mashhad', 'd' => 'Shiraz'];

// اولین شهری که اسم بیش از ۶ کارکتر دارد را پیدا کن
$result = array_find_key($array, function ($value) {
    return strlen($value) > 4;
});

var_dump($result); // string(1) "c"

اگر هیچ کلید مطابقت‌داری پیدا نشود، array_find_key مقدار NULL را برمی‌گرداند

array_any

این تابع بررسی می‌کند که آیا هیچ عنصر در آرایه با یک شرط معین مطابقت دارد یا خیر. اگر حداقل یک عنصر مطابقت داشته باشد، مقدار true را برمی‌گرداند و در غیر این صورت false.

$array = ['a' => 'Tehran', 'b' => 'Tabriz', 'c' => 'Mashhad', 'd' => 'Shiraz'];

// بررسی کن آیا شهری وجود دارد که بیش از ۶ کارکتر باشد
$result = array_any($array, function ($value) {
    return strlen($value) > 6;
});

var_dump($result); // bool(true)

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

$array = ['a' => 'Tehran', 'b' => 'Tabriz', 'c' => 'Mashhad', 'd' => 'Shiraz'];

// بررسی کن آیا شهری وجود دارد که بیش از ۹ کارکتر باشد
$result = array_any($array, function ($value) {
    return strlen($value) > 9;
});

var_dump($result); // bool(false)

array_all

این تابع بررسی می‌کند که آیا همه عناصر در آرایه با یک شرط معین مطابقت دارند یا خیر. اگر همه عناصر مطابقت داشته باشند، مقدار true را برمی‌گرداند و اگر حداقل یک عنصر مطابقت نداشته باشد، false را برمی‌گرداند.

$array = ['a' => 'Tehran', 'b' => 'Tabriz', 'c' => 'Mashhad', 'd' => 'Shiraz'];

// بررسی کن اگر همه شهرها کمتر از ۱۲ کارکتر هستند
$result = array_all($array, function ($value) {
    return strlen($value) < 12;
});

var_dump($result); // bool(true)

توابع جدید multibyte trimming

اکستنشن mbstring در PHP 8.4 اکنون شامل سه تابع جدید به نام‌های mb_trim()، mb_ltrim() و mb_rtrim() است. این توابع white space ها را به طور امن و مطمئن از رشته‌ها حذف می‌کنند. تا قبل از این باید در رجکس و با عبارت \s این کار انجام می‌شد که آن هم مشکلاتی داشت. برای درک بهتر این ایشو را ببینید و یا به مثال‌های زیر توجه کنید:

// این موارد کماکان مثل تابع trim() حذف می‌شوند
U+0020 SPACE (also in Separator category)
U+0009 \t
U+000A \n
U+000B \v
U+000D \r

// این مورد در trim() حذف نمی‌شد 
U+000C \f

// این مورد در trim() حذف نمی‌شد ولی با regex /s حذف می‌شد
U+0000 \0

توابع موجود در PHP 8.4 و رفتار پیش‌فرض آن‌ها:

  • mb_trim($string, $characters): کاراکترها را از هر دو طرف یک رشته برش می‌دهد.
  • mb_ltrim($string, $characters): کاراکترها را از ابتدای (سمت چپ) یک رشته برش می‌دهد.
  • mb_rtrim($string, $characters): کاراکترها را از انتهای (سمت راست) یک رشته برش می‌دهد.

به‌طور پیش‌فرض، $characters شامل انواع مختلفی از کاراکترهای فضای خالی است، اما نه همه کاراکترهای ممکن یونیکد به دلیل نگرانی‌های مربوط به ذخیره‌سازی و سازگاری.

تغییرات توابع/سینتکس‌ها

Password Hashing

در نسخه PHP 8.4 مقدار عدد پارامتر cost در تابع  password_hash() از ۱۰ به ۱۲ تغییر پیدا کرده است.

PHP توابع  password_verify() ،  password_hash() و  password_needs_rehash() را برای هش کردم ایمن رمزهای عبور ارائه کرده است. می‌توان الگوریتم هش ( PASSWORD_BCRYPT, PASSWORD_ARGON2I, PASSWORD_ARGON2ID و …) و پارامترهای مربوط به آن نظیر cost را تنظیم کرد. همین اطلاعات در خود پسورد تولید شده قابل تشخیص است، پس می‌توان به راحتی با پسورد مورد نظر را اعتبارسنجی و تایید کرد.

echo password_hash('unrivaled.ir', PASSWORD_BCRYPT);
// $2y$10$OGxPpQ/9.xNc426XXTywhOlG2ihkSz.fRqZWtj/LUSbATcJPjh0Ou
echo password_hash('unrivaled.ir', PASSWORD_BCRYPT, ['cost' => 12]);
// $2y$12$W9hnFRnYKBKRL6gn9AUtFuXgm6a7Xy5hQylX2t9s/M3YAaaK.6u5C

برای PASSWORD_BCRYPT / PASSWORD_DEFAULT، مقدار cost به‌صورت پیش‌فرض ۱۰ بود که حال در نسخه PHP 8.4 به ۱۲ تغییر کرده است. پارامتر cost تعداد تکرار هش شدن پسورد را مشخص می‌کند. هر چه عدد مربوط بیشتر باشد، امنیت پسورد هش شده بیشتر و مقاوم‌تر نسبت به کرک است. عدد پارامتر cost در توان ۲ محاسبه می‌شود. به عنوان مثال ورودی ۱۲ به معنای ۲ به توان ۱۲ است. البته باید در نظر داشت بالا بودن عدد پارامتر cost منجر به طولانی شدن زمان محاسبه نیز می‌شود. در جدول زیر این مساله مشخص شده است:

CPU Model Frq Year ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴
Intel i5-2430M ۲.۴ GHz ۲۰۱۱ ۲۱ ۴۱ ۸۰ ۱۶۱ ۳۲۷ ۶۵۷ ۱۳۱۹
Intel Xeon E32145 ۳.۳ GHz ۲۰۱۱ ۱۶ ۳۲ ۶۴ ۱۲۸ ۲۵۶ ۵۲۳ ۱۰۴۷
AMD EPYC 7002 ۲۰۱۹ ۱۴ ۲۹ ۵۸ ۱۱۶ ۲۴۴ ۴۸۵ ۹۹۷
Intel Xeon E-2246G ۳.۶ Ghz ۲۰۱۹ ۱۱ ۲۰ ۳۹ ۷۸ ۱۵۸ ۳۱۶ ۶۳۱
AMD Ryzen 4800H ۲.۹ Ghz ۲۰۲۰ ۲۱ ۴۵ ۶۰ ۱۰۵ ۲۱۰ ۴۱۶ ۸۵۰
Intel Xeon Skylake IBRS ۲۰۲۰ ۱۳ ۲۷ ۵۴ ۱۰۸ ۲۱۶ ۴۳۲ ۸۷۳
Apple M1 Pro ۲۰۲۱ ۱۵ ۳۱ ۶۱ ۱۲۱ ۲۴۰ ۴۸۰ ۹۶۵

آیا PHP مرده است؟

این سوال که شاید PHP به دوران مرگ خود نزدیک شده است ذهن خیلی از توسعه‌دهندگان وب را درگیر خود کرده است. مخصوصا با ظهور زبان‌های جدید مثل Rust، Python، GoLang و   … بسیاری از برنامه‌نویسان وب احساس خطر کرده‌اند و مشاهده شده که حداقل به مهاجرت به زبان‌های دیگر فکر کرده‌اند. اما خبر خوب این است که PHP قطعا خیلی با مرگ فاصله دارد. مهم نیست که هر توسعه دهنده ناراضی ممکن است به شما بگوید دوران PHP به اتمام رسیده است. به هر حال، ۷۷ درصد از تمام وب‌سایت‌های دنیا نمی‌توانند اشتباه کنند، و مهم‌تر از همه، سهم بازار PHP در طول پنج سال گذشته نسبتاً ثابت باقی مانده است (بین ۷۸ تا ۸۰ درصد در نوسان است). تعداد کمی از زبان های برنامه نویسی به این نوع از قدرت ماندگار فرمان می دهند.

زبان برنامه‌نویسی  سهم بازار در سال ۲۰۲۳
PHP ۷۶.۹%
ASP.NET ۶.۸%
Ruby ۵.۵%
Java ۴.۷%
JavaScript ۳.۰%
Scala ۲.۹%
Static files ۱.۸%
Python ۱.۴%
ColdFusion ۰.۳%
Perl ۰.۲%
Erlang ۰.۱%

تاریخ انتشار PHP 8.4

PHP 8.4 در تاریخ ۲۱ نوامبر ۲۰۲۴ (به شمسی ۱ آذر ۱۴۰۳) منتشر شد. این نسخه فقط تا ۳۱ دسامبر ۲۰۲۶ (به شمسی ۱۰ دی ۱۴۰۵) پشتیبانی می‌شود ولی تا ۳۱ دسامبر ۲۰۲۸ (به شمسی ۱۱ دی ۱۴۰۷) آپدیت‌های امنیتی دریافت خواهد کرد.

اطلاعات بیشتر از پشتیبانی PHP 8.4

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

تشخیص ربات نبودن *محدودیت زمانی مجاز به پایان رسید. لطفا کد امنیتی را دوباره تکمیل کنید.