php 7.3 و تغییرات مهم آن

php 7.3 و تغییرات مهم آن

خب قصد داریم که بصورت مختصر و کاربردی تغییرات نسخه php 7.3 رو بررسی کنیم. در این نسخه شاهد تغییرات زیادی بودیم که کاربردی ترین و تاثیر گذار ترین آن ها را بررسی می کنیم.

تغییرات در ساختار Heredoc و Nowdoc

احتمالا شما هم با ساختار های Heredoc و Nowdoc آشنا هستید و از آن ها استفاده کرده اید. اگر این اسم ها برای شما نا آشناست به مثالی از آن ها توجه کنید:

$foo = <<<IDENTIFIER
This is simple of heredoc and nowdoc syntax
"foo" bar;
IDENTIFIER

از این ساختار برای نگهداری رشته های چند خطی استفاده می شود. مهم ترین نکته اینست که IDENTIFIER پایانی حتما باید ابتدا خط باشد. بدین معنی که قبل از آن هیچ گونه کاراکتری مثل فاصله و یا تب نباید باشد. در نسخه جدید php این محدودیت رفع شده است که به هرچه زیباتر شدن کد با تورفتگی کمک می کند. تغییراتی که این ساختار در نسخه جدید داشته است به شرح ذیل می باشد:

  1. نیازی نیست IDENTIFIER پایانی ابتدا خط باشد.
  2. IDENTIFIER پایانی می تواند با فاصله و تب تورفتگی داشته باشد.
  3. برای تورفتگی بصورت همزمان نمی توانید از فاصله و تب استفاده کنید.
  4. فاصله های قبل IDENTIFIER پایانی، از رشته داخل بلاک حذف می شوند.
  5. اگر تورفتگی علامت پایانی بیشتر از رشته داخل بلاک باشد خطا دریافت می کنید.
  6. با قوانین بالا شما می توانید از این ساختار داده در آرایه ها به شکل بهتری نیز استفاده کنید. به مثال زیر توجه کنید:
$foo = ['php', '7.3', <<<EOT
  foo
    -  hello world! --
  bar
  EOT, 'snippets', 'ir'
];

var_dump($foo);

که خروجی آن به شکل زیر است.

array(5) {
  [0]=>
  string(3) "php"
  [1]=>
  string(3) "7.3"
  [2]=>
  string(36) "foo
    -  hello world! --
  bar"
  [3]=>
  string(8) "snippets"
  [4]=>
  string(2) "ir"
}

سازگاری با نسخه قبل:

اگر شما از علامت استفاده شده برای تعریف بلاک، در رشته خود استفاده نکرده باشید در این نسخه مشکلی نخواهید داشت. به عنوان مثال در کد زیر، در خط 4 بلاک تمام می شود.

$foo = <<<HELLO
  HELLO_WORLD <-- this will not terminate the string literal
  HELLOWORLD <-- this one will not either. 
  HELLO WORLD<-- this one will
HELLO;

 

مدیریت خطا در json_encode و json_decode

در نسخه های قبل مدیریت خطا در json_decode مشکل بزرگی بود. و مشکل بزرگتر آنکه راه حلی که برای آن پیشنهاد شده بود دارای استثنا است. تابع json_decode در زمانی که json مشکل داشته باشد مقدار null را تولید می کرد، در حالی که مقدار null خود می تواند یک مقدار صحیح json باشد.

در این نسخه یک flag معرفی شده است که می توانید از آن به شکل برای مدیریت خطا استفاده نمایید.

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

سازگاری با نسخه قبل:

اگر در کدتان ثابت JSON_THROW_ON_ERROR و یا کلاس JsonException را تعریف نکرده باشید هیچ مشکلی نخواهید داشت.

 

Refrence در تابع list

list یک تابع مفید برای انتصاب مقادیر یک آرایه به متغیرها می باشد. تا قبل از php 7.3 امکان پاس دادن متغیر ها همراه با refrence وجود نداشت. به کاربرد این تغییر در مثال زیر توجه نمایید. در نسخه های قبلی خط 2 دارای خطا بوده است.

$arr = ['apple', 'orange'];
list($a, &$b) = $arr;
$b = 'banana';
echo $arr[1]; // banana

توجه کنید که آرایه ارسالی به تابع list باید حتما در متغیر ذخیره شده باشد. کد زیر دارای خطا خواهد بود.

list($a, &$b) = [12, 14];
// Fatal error: Cannot assign reference to non referencable value in .. on line ..

این تغییر با نسخه قبل کاملا سازگار است.

 

معرفی تابع is_countable

در نسخه های قبلی در صورتی که یک متغیر غیر قابل شمارش را به تابع count پاس می دادیم، با یک هشدار روبرو می شدیم. یک راه حل ساده بررسی قابل شمارش بودن متغیر است. متغیر قابل شمارش یک آرایه یا شی پیاده سازی شده وسط Countable است. این بررسی از این به بعد توسط تابع is_countable انجام خواهد شد.

سازگاری با نسخه قبل:

در صورتی که در کدتان تابع is_countable را تعریف نکرده باشید با مشکلی روبرو نخواهید شد.

 

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

پی اچ پی در حدود 75 تابع برای کار با آرایه ها دارد اما هیچ راه حل ساده ای برای دریافت کلید اولین و آخرین عنصر آرایه ندارد. البته اینکار با استفاده از تابع array_keys و و دریافت اولین عنصر امکان پذیر هست اما ساده نیست! در php 7.3 می توانید براحتی با استفاده از توابع معرفی شده کلید های ابتدایی و انتهایی آرایه را دریافت کنید.

قابل ذکر است که در RFC پیشنهاد اضافه شدن توابع array_value_first و array_value_last هم مطرح شده بود که رد شد.

سازگاری با نسخه قبل:

در صورتی که کدتان شامل توابع array_key_first و array_key_last نباشد نگران هیچ چیز نباشید!

 

منقضی شدن ثابت های غیرحساس به حروف کوچک و بزرگ

در نسخه های قبلی php، تابع define دارای 3 پارامتر بود که پارامتر آخر مشخص می کرد که ثابت به حروف کوچک و بزرگ حساس است یا خیر. حالا این پارامتر حذف شده است و تمامی ثابت های شما به حروف کوچک و بزرگ حساس هستند.

define('Foo', 'Bar', true);

اگر کد بالا را اجرا کنید خطای زیر را دریافت می کنید:

Deprecated: define(): Declaration of case-insensitive constants is deprecated in ...

همچنین اگر ثابت تعریف شده را بصورت FOO فراخوانی کنید خطای زیر را دریافت می کنید:

Deprecated: Case-insensitive constants are deprecated. The correct casing for this constant is "Foo"

سازگاری با نسخه های قبل:

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

اگر علاقه مندید که تغییرات این نسخه را مو به مو دنبال کنید RFC آن را حتما بخوانید.

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

نشانی ایمیل شما منتشر نخواهد شد.