در اواخر سال 2018 و اوایل 2019 تیم توسعه ی PHP نسخه ی 7.3 زبان PHP را ارائه داد. من در این مقاله ی چند قسمتی سعی می کنم فقط مهم ترین موارد این بروز رسانی را برایتان توضیح بدهم، اگر دوست دارید با تمام موارد تغییر کرده در این بروز رسانی آشنا شوید به صفحه ی PHP 7.3 upgrade notes مراجعه کنید. البته در مقالات بعد به سراغ ویژگی های جدید نسخه ی 7.4 زبان PHP هم خواهیم رفت اما فعلا با 7.3 شروع می کنیم. تغییرات مهم در این نسخه ی PHP عبارت اند از:
JSON_THROW_ON_ERROR
()list
is_Countable
()array_key_first
و ()array_key_last
Argon2
ما در قسمت قبل برخی از این موارد را بررسی کردیم و حالا در این قسمت نوبت به بررسی موارد باقی مانده می رسد.
قبل از توضیح این مورد باید با Reference Assignment (به معنی «انتساب ارجاعی») آشنا شویم. همانطور که می دانید از یک نظر در زبان PHP دو نوع انتساب خاص داریم:
به کد زیر نگاه کنید:
<?php $a = 3; $b = &$a; // $b is a reference to $a print "$a\n"; // prints 3 print "$b\n"; // prints 3
در کد بالا متغیر a برابر 3 است و متغیر b برابر با ارجاعِ متغیر a (به دلیل وجود علامت &
قبل از a) است. در ظاهر مقدار هر دو متغیر a و b برابر با 3 است اما به خاطر وجود علامت &
، مقدار b یک ارجاع به مقدار a است. یعنی اگر مقدار a را تغییر بدهیم مقدار b نیز تغییر می کند اما اگر علامت & را نداشتیم با تغییر مقدار a، مقدار b تغییر نمی کرد چرا که دیگر ارجاع نبود بلکه مقدار 3 کپی می شد و جداگانه برای b قرار می گرفت:
$a = 4; // change $a print "$a\n"; // prints 4 print "$b\n"; // prints 4 as well, since $b is a reference to $a, which has been changed
می بینید که با تغییر a، متغیر b نیز تغییر می کند. در صورت نیاز به توضیح بیشتر به این مقاله ی جاوا اسکریپتی مراجعه کنید.
حالا باید با ()list
آشنا شویم که احتمالا با آن آشنا هستید. با استفاده از list می توانید مقدار دهی به متغیرها را به صورت دسته جمعی انجام بدهید. به مثال زیر توجه کنید:
$info = array('coffee', 'brown', 'caffeine'); // Listing all the variables list($drink, $color, $power) = $info; echo "$drink is $color and $power makes it special.\n";
حالا متغیرهای drink و color و power مقادیر coffe و brown و caffeine را می گیرند، به عبارت دیگر تمام این متغیرها را به صورت دسته جمعی مقدار دهی کرده ایم! برای اطلاعات بیشتر به صفحه ی رسمی PHP برای list مراجعه کنید. خب این ها چه ربطی به PHP 7.3 دارد؟
قبل از نسخه ی 7.3 نمی توانیم pass by reference داشته باشیم اما از این به بعد می توانیم:
$array = [1, 2]; list($a, &$b) = $array;
که در واقع معادل کد زیر است:
$array = [1, 2]; $a = $array[0]; $b =& $array[1];
اضافه شدن تابع is_Countable
تا قبل از معرفی نسخه ی 7.2 از زبان PHP اگر سعی می کردیم مقدار غیر قابل شمارشی را ()Count کنیم با خطا روبرو می شدیم. برای جلوگیری از بروز این خطا در برنامه هایمان باید از منطق زیر استفاده می کردیم:
if (is_array($foo) || $foo instanceof Countable) { // $foo is countable }
اما تابع ()is_countable
دیگر کار برنامه را مختل نمی کند و اگر مقدار ما قابل شمارش بود true و در غیر این صورت false را برمی گرداند بنابراین کد بالا به شکل زیر خلاصه می شود:
if (is_countable($foo)) { // $foo is countable }
در حال حاضر اگر بخواهیم اولین و آخرین key یک آرایه را دریافت کنیم باید از توابع reset و end و key استفاده کنیم که باعث تغییر state داخلی برنامه می شوند (مثلا array pointer را جابجا می کنند). راه حل های دیگری هم در سطح اینترنت وجود دارند اما معمولا باعث کاهش عملکرد و سرعت برنامه می شوند یا اینکه بسیار شلوغ هستند.
با معرفی ()array_key_first
و ()array_key_last
می توانیم اولین و آخرین key آرایه را بدون تغییر دادن pointer آرایه دریافت کنیم. اگر نمی دانید pointer چیست به قسمت «دریافت داده ها از طریق ()fetch
» از این مقاله مراجعه کنید. مقاله در رابطه با PDO است اما مفهوم یکی است و با خواندن آن متوجه pointer در پایگاه داده یا آرایه یا هر چیز دیگری می شوید.
همانطور که می دانید Argon2 یک الگوریتم هش است که به عنوان جایگزین الگوریتم Bcrypt
در نسخه ی 7.2 زبان PHP ارائه شد. بنابراین می توانستیم از PASSWORD_ARGON2I
در تمام توابع password استفاده کنیم. مثال:
password_hash('password', PASSWORD_ARGON2I);
اما در نسخه ی 7.3 شاهد ارائه ی سه نسخه ی مختلف از این الگوریتم هستیم:
Argon2d
: مقاومت نسبت به حملات GPU cracking (حملات کرک رمز بر اساس GPU یا پردازنده های گرافیکی) را افزایش می دهد. سریع تر بوده و از دسترسی حافظه وابسته به داده (data-depending memory access) استفاده می کند.Argon2i
: از دسترسی حافظه غیروابسته به داده (data-independent memory access) استفاده می کند که برای هش کردن رمز های عبور کاربران مناسب تر است. کُند تر است تا جلوی حملات tradeoff attacks را بگیرد.Argon2id
: نسخه ی ترکیبی از دو مورد بالا است که از روش Argon2i
برای دور اول دسترسی به حافظه و از روش Argon2d
برای دور های بعدی استفاده می کند.حالت Argon2id
برای استفاده در اینترنت پیشنهاد می شود مگر اینکه دلیل محکمی برای انتخاب حالت دیگری داشته باشید. مثال:
password_hash('password', PASSWORD_ARGON2ID);
منسوخات و موارد حذف شده
تابع ()image2wbmp
یک نسخه ی WBMP از تصویر مورد نظر ما را ارائه می داد و سه آرگومان می گرفت: فایل تصویری، نام فایل (مسیر ذخیره)، رنگ پس زمینه. از آنجایی که این تابع دقیقا مشابه با تابع ()imagewbmp است، RFC تصمیم بر حذف آن گرفته است. بنابراین در نسخه ی 7.3 زبان PHP هر نوع استفاده از تابع ()image2wbmp
باعث نمایش یک warning می شود و در نسخه های بعدی با fatal error روبرو خواهید شد.
از موارد دیگری که حذف شده اند ثابت (constant) هایی هستند که به حروف بزرگ یا کوچک حساس نیستند. در حال حاضر PHP از هر دو حالت (حساس به حروف بزرگ و کوچک و غیر حساس) برای Constant ها پشتیبانی می کند. به همین دلیل RFC تصمیم گرفته است که:
()define
تعریف شوند نیز به صورت پیشفرض case-sensitive خواهند بود.بنابراین از این به بعد ثابت ها همیشه case-sensitive خواهند بود و قوانین زیر اجرا خواهند شد:
()define
به true غیر مجاز خواهد شد (در نسخه ی 7.3).true
و false
و null
(در نسخه ی 7.3).true
و false
و null
از ثابت های خاص به کلمات کلیدی رزرو شده (از PHP 8).حذفیات و موارد منسوخ شده ی زیاد دیگری نیز وجود دارد که با مراجعه به صفحه ی RFC برای حذفیات می توانید آن ها را مشاهده کنید.
امیدوارم این مقاله توانسته باشد به شما توسعه دهندگان ایرانی کمک کند تا یک قدم در مسیر حرفه ای شدن جلوتر بروید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.