ویژگی های جدید در نسخه ی 7.3 زبان PHP چیست؟ (قسمت دوم)

20 آبان 1398
ویژگی های جدید در نسخه ی 7.3 زبان PHP چیست؟

ویژگی های جدید در نسخه ی 7.3 زبان PHP چیست؟ (قسمت دوم)

در اواخر سال 2018 و اوایل 2019 تیم توسعه ی PHP نسخه ی 7.3 زبان PHP را ارائه داد. من در این مقاله ی چند قسمتی سعی می کنم فقط مهم ترین موارد این بروز رسانی را برایتان توضیح بدهم، اگر دوست دارید با تمام موارد تغییر کرده در این بروز رسانی آشنا شوید به صفحه ی PHP 7.3 upgrade notes مراجعه کنید. البته در مقالات بعد به سراغ ویژگی های جدید نسخه ی 7.4 زبان PHP هم خواهیم رفت اما فعلا با 7.3 شروع می کنیم. تغییرات مهم در این نسخه ی PHP عبارت اند از:

  • Syntax جدید و انعطاف پذیر برای Heredoc و Nowdoc
  • قابلیت استفاده از Trailing Comma
  • اضافه شدن JSON_THROW_ON_ERROR
  • انتساب ارجاعی در ()list
  • تابع is_Countable
  • ()array_key_first و ()array_key_last
  • بهبود الگوریتم هش رمز Argon2
  • منسوخات و موارد حذف شده

ما در قسمت قبل برخی از این موارد را بررسی کردیم و حالا در این قسمت نوبت به بررسی موارد باقی مانده می رسد.

تابع ()list و Reference Assignment

قبل از توضیح این مورد باید با Reference Assignment (به معنی «انتساب ارجاعی») آشنا شویم. همانطور که می دانید از یک نظر در زبان PHP دو نوع انتساب خاص داریم:

  • Pass by reference (پاس دادن مقدار بر اساس ارجاع)
  • Pass by value (پاس دادن مقدار بر اساس مقدار)

به کد زیر نگاه کنید:

<?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
}

معرفی توابع array_key_first و array_key_last

در حال حاضر اگر بخواهیم اولین و آخرین key یک آرایه را دریافت کنیم باید از توابع reset و end و key استفاده کنیم که باعث تغییر state داخلی برنامه می شوند (مثلا array pointer را جابجا می کنند). راه حل های دیگری هم در سطح اینترنت وجود دارند اما معمولا باعث کاهش عملکرد و سرعت برنامه می شوند یا اینکه بسیار شلوغ هستند.

با معرفی ()array_key_first و ()array_key_last می توانیم اولین و آخرین key آرایه را بدون تغییر دادن pointer آرایه دریافت کنیم. اگر نمی دانید pointer چیست به قسمت «دریافت داده ها از طریق ()fetch» از این مقاله مراجعه کنید. مقاله در رابطه با PDO است اما مفهوم یکی است و با خواندن آن متوجه pointer در پایگاه داده یا آرایه یا هر چیز دیگری می شوید.

بهبود الگوریتم هش رمز Argon2

همانطور که می دانید 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 تصمیم گرفته است که:

  • ثابت های کلاس ها همیشه case-sensitive (حساس به بزرگی و کوچکی حروف) باشند.
  • ثابت های سراسری که با const تعریف شوند همیشه case-sensitive خواهند بود.
  • ثابت هایی که با ()define تعریف شوند نیز به صورت پیشفرض case-sensitive خواهند بود.

بنابراین از این به بعد ثابت ها همیشه case-sensitive خواهند بود و قوانین زیر اجرا خواهند شد:

  • تعیین پارامتر سوم تابع ()define به true غیر مجاز خواهد شد (در نسخه ی 7.3).
  • دسترسی به ثابت های case-insensitive (غیر حساس) با حروفی غیر از زمان تعریف شدنشان غیر مجاز خواهد شد، البته به استثنای true و false و null (در نسخه ی 7.3).
  • غیر قانونی شدن تعریف ثابت های case-insensitive (غیر حساس) از نسخه ی 8 زبان PHP.
  • تبدیل true و false و null از ثابت های خاص به کلمات کلیدی رزرو شده (از PHP 8).

حذفیات و موارد منسوخ شده ی زیاد دیگری نیز وجود دارد که با مراجعه به صفحه ی RFC برای حذفیات می توانید آن ها را مشاهده کنید.

امیدوارم این مقاله توانسته باشد به شما توسعه دهندگان ایرانی کمک کند تا یک قدم در مسیر حرفه ای شدن جلوتر بروید.

نویسنده شوید

دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.