آموزش تعریف نوع بازگشتی در PHP
اگر با زبانهایی همچون جاوا، سی، سیشارپ، ویبی و …کار کرده باشید، میدانید که برای تعریف یک متغیر بر فرض از نوع عددی، حتما باید نوع آن را مشخص کنیم و مثل PHP نمیتوانیم به سادگی مثلا با نوشتن یک علامت $ در ابتدای نام متغیرها اینکار را انجام دهیم! همچنین باید نوع بازگشتی توابع (چیزی که return) میشود را هم مشخص کنیم؛ ولی در php اصلا نیازی نیست و میتوان هزارنوع مختلف از یک تابع به بیرون return کرد!
در زبانهای یاد برده شده، تابع نمیتواند هیچ مقداری به جز مقدار تعریف شده را برگرداند و محیطهای توسعه و کامپایلرهایشان، خطای زمان اجرا میگیرند و سورس کامپایل نمیشود! حالا این ویژگی به PHP 7 اضافه شده و شما به صورت کاملا اختیاری میتوانید چنین کاری را برای توابع خود انجام دهید که تنها موظف شوند تا دقیقا همان نوع تعریف شده را برگردانند.
سینتکس تعریف نوع بازگشتی تابع
function test(): type { return x; }
بعد از علامت پارانتز ورودیهای تابع، یک علامت دذو نقطه : گذاشته و سپس نوع را مینویسیم که میتواند int, float bool, string, interfaces, array, callable و … باشد.
تعریف strict_types
برای مقادیری بازگشتی string, int, float, bool ، اجراکنندهی کد PHP تا جایی که بتواند از گزارش خطا جلوگیری کرده و عملیات type casting (یا تبدیل نوع) را انجام میدهد. برای مثال:
function number(): int { return 3.14; } echo number(); // 3
حالا همانطور که میبینید، با اینکه خروجی از نوع int میباشد، ولی مقدار cast شده و 3 به بیرون آمده است.
ولی برای جلوگیری از اینگونه رویدادها، همیشه باید مقدار strict_types را تنظیم کنیم؛ تا مقدار بازگشتی دقیقا هماهنگ و از یک نوع مشخص شده باشد. بدین منظور:
declare(strict_types = 1); function test1(int $value): int { return $value; } print(test1(5)); // ------------------------- declare(strict_types = 1); function test2(int $value): int { return $value + 1.0; } print(test2(5)); // ------------------------- declare(strict_types=1); function sum($a, $b): int { return $a + $b; } echo sum(1, 2.5);
تنها مورد اول صحیح است و دو مورد بعدی خطا خواهند گرفت.
این خطاها از نوع E_RECOVERABLE_ERROR هستند.
اینترفیسها
میتوانید برای توابع interface ها هم نوع بازگشتی تعریف کنید تا اگر کلاسی از آنها استفاده کرد، حتما از همان نوع بازگشتی باشد.
interface A { static function test(): A; } class B implements A { static function test(): A { return new B(); } }
حالا حتما باید درون کلاس، مقداری از نوع مشخص شده برای interface را برگرداند و اگر چنین جیزی نباشد، خطای E_COMPILE_ERROR رخ میدهد.
نکته
برای متدهایسازنده (constructors)، متدهای destructors و clone نمیتوانید نوع بازشگتی تعریف کنید.
نظرات ثبت شده بدون دیدگاه