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 این محدودیت رفع شده است که به هرچه زیباتر شدن کد با تورفتگی کمک می کند. تغییراتی که این ساختار در نسخه جدید داشته است به شرح ذیل می باشد:
- نیازی نیست IDENTIFIER پایانی ابتدا خط باشد.
- IDENTIFIER پایانی می تواند با فاصله و تب تورفتگی داشته باشد.
- برای تورفتگی بصورت همزمان نمی توانید از فاصله و تب استفاده کنید.
- فاصله های قبل IDENTIFIER پایانی، از رشته داخل بلاک حذف می شوند.
- اگر تورفتگی علامت پایانی بیشتر از رشته داخل بلاک باشد خطا دریافت می کنید.
- با قوانین بالا شما می توانید از این ساختار داده در آرایه ها به شکل بهتری نیز استفاده کنید. به مثال زیر توجه کنید:
$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 آن را حتما بخوانید.