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

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

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

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

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

Syntax جدید برای Heredoc و Nowdoc

به نظر من باید در مورد Nowdoc و Heredoc بیشتر توضیح بدهم چرا که یکی از ویژگی های بسیار مهم اضافه شده در PHP هستند. دستور Heredoc به شما اجازه می دهد که بدون نیاز به escape کردن کاراکترهای خاص (مانند اسلش ها و آپاستروفی ها) بتوانید متن های طولانی را یکجا در کد خودتان اضافه کنید. این دستور با >>> و یک marker شروع شده و سپس با همان marker تمام می شود. منظور من از marker یا identifier هر نامی است که شما برای آن انتخاب کنید (البته فقط باید از اعداد و حروف باشد). من در اینجا EOT را انتخاب کرده ام:

print <<<EOT
Heredoc text behaves just like a double-quoted string, without the double quotes.
EOT;

دستور newdoc دقیقا مانند همین heredoc عمل می کند اما دو تفاوت اصلی دارد:

  • EOT (همان identifier ما) باید در single quotation (علامت ') باشد.
  • هیچ parsing ای (تجزیه و تحلیل کد) درون آن انجام نمی شود.

مثال:

print <<<'EOT'
Nowdocs are to single-quoted strings what heredocs are to double-quoted strings.
EOT;

بنابراین می توان گفت heredoc دقیقا مانند یک رشته است که با double quotation (علامت ") ساخته شده و nowdoc دقیقا مانند رشته ای است که با single quotation (علامت ') ساخته شده باشد. حواستان باشد که در هر دو دستور اجازه ی indent کردن (جلو بردن با تب یا اسپیس) EOT را ندارید و دقیقا باید مانند مثال های بالا آن را بنویسید. به طور مثال کد زیر کاملا غلط است:

class foo {
    public $bar = <<<EOT
    bar
    EOT;
}
// Identifier

شکل صحیح آن در نسخه ی 7.2 زبان PHP به صورت زیر است:

class foo {
    public $bar = <<<EOT
bar
EOT;
}

بنابراین به طور خلاصه در PHP 7.2:

  • EOT نباید indent شود.
  • در خطی که EOT پایانی قرار دارد هیچ کاراکتر دیگری نباید وجود داشته باشد (حتی اسپیس).

اما با معرفی نسخه ی 7.3 دو تغییر به وجود آمد. تغییر اول آن بود که از این به بعد اجازه ی indent کردن EOT را داریم بنابراین کد زیر کاملا صحیح است:

class foo {
    public $bar = <<<EOT
        bar
    EOT;
}

البته این indentation نباید از بدنه ی اصلی کد جلوتر برود. به طور مثال کد زیر غلط است:

class foo {
    public $bar = <<<EOT
    bar
        EOT;
}

همچنین یادتان باشد که اگر برای indent کردن خط های قبلی از اسپیس استفاده کرده اید باید برای indent کردن EOT نیز از اسپیس و اگر از tab استفاده کرده اید برای EOT نیز از tab استفاده کنید، بنابراین اجازه ی تغییر ندارید.

تغییر دوم این بود که دیگر نیازی به کاراکتر new line پس از EOT نیست. قبل از آن EOT حتما باید با کاراکتر new line تمام می شد (به خط بعدی می رفتیم):

$values = [<<<END
a
b
c
END
, 'd e f'];

اما حالا دیگر نیازی به رفتن به خط بعد نداریم بنابراین کد زیر در نسخه ی 7.3 صحیح است:

$values = [<<<END
a
b
c
END, 'd e f'];

در صورت تمایل اطلاعات بیشتر را در این صفحه پیدا خواهید کرد. همچنین صفحات رسمی سایت PHP برای heredoc و newdoc نیز برایتان لینک شده است.

قابلیت استفاده از Trailing Comma

Trailing comma یا final commas قابلیتی در PHP است که بسیار کاربردی می باشد. بگذارید یک مثال از جاوا اسکریپت بزنم تا بدانید این قابلیت مخصوص زبان PHP نیست. فرض کنید لیستی از متغیر ها یا خصوصیات را تعریف کرده ایم:

 var arr = [
  1, 
  2, 
  3 
];

همانطور که می بینید آخرین عدد دارای کاما (ویرگول انگلیسی) نیست و اضافه کردن آن در قدیم باعث خطا می شد. حالا اگر بخواهیم یک عضو دیگر به این آرایه اضافه کنیم به خطا برمی خوریم! چرا؟ به دلیل اینکه عضو جدید به شکل زیر اضافه خواهد شد:

var arr = [
  1, 
  2, 
  3
  4
];

بین 3 و 4 هیچ ویرگولی نیست بنابراین این کد مشکل دارد. قابلیت Trailing comma به شما اجازه می دهد که به عضو آخر نیز کاما بدهید:

var arr = [
  1, 
  2, 
  3, 
];

حالا اگر بخواهید به این آرایه چیزی اضافه کنید به مشکل برنخواهید خورد. Trailing comma ها در آرایه ها و همچنین namespace های گروهی قابل استفاده هستند اما در نسخه ی 7.3 می توانیم از Trailing comma در تعریف توابع نیز استفاده کنیم! به مثال های زیر از زبان PHP توجه کنید:

foo(
    $bar,
    $baz,
);
$newArray = array_merge(
    $arrayOne,
    $arrayTwo,
    ['foo', 'bar'],
);

استفاده در debugging و... :

var_dump(
    $foo,
    $bar,
    $baz,
);
unset(
    $foo,
    $bar,
    $baz,
);

isset(
    $foo,
    $bar,
    $baz,
);

بنابراین می توانیم از آن ها در انواع دستورات استفاده کنیم.

معرفی JSON_THROW_ON_ERROR

یکی از ویژگی هایی که کار ما را بسیار راحت می کند معرفی JSON_THROW_ON_ERROR برای مدیریت خطاهای فایل های JSON است. در حال حاضر تابع ()json_decode در صورت بروز خطا مقدار null را برمی گرداند اما ما می دانیم که null برخی اوقات یک مقدار معتبر است ممکن است در شرط ها صحیح باشد. در قدیم برای حل این مشکل باید از توابعی مانند ()json_last_error و ()json_last_error_msg استفاده می کردیم که خطاها را به ترتیب برای ماشین (کامپیوتر) و انسان نمایش می دهند. از طرفی تابع ()json_encode در صورت بروز خطا false را برمی گرداند که بهتر از null است اما هیچ کدام از این خطاها نه برنامه را متوقف می کنند و نه خطایی throw می کنند.

در نسخه ی 7.3 زبان PHP یک flag جدید به نام JSON_THROW_ON_ERROR ارائه شده است که در صورت بروز خطا توسط تابع های ()json_decode و ()json_encode یک JsonException پرتاب می کنند. بنابراین از این به بعد یک روش ساده برای throw کردن خطاهای مربوط به JSON به شکل زیر است:

try {
    json_decode("{", false, 512, JSON_THROW_ON_ERROR);
}
catch (\JsonException $exception) {
    echo $exception->getMessage(); // echoes "Syntax error"
}

در قسمت بعدی موارد باقی مانده را بررسی خواهیم کرد.

نویسنده شوید

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

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