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 را برمیگرداند.
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