آشنایی با مفهوم Return Type Declaration در زبان PHP


با عرضهٔ PHP 7، فیچر جدیدی تحت عنوان Return Type Declaration به این زبان افزوده شد که بر آن اساس توسعه‌دهنده می‌تواند دیتا تایپی که یک تابع ریترن می‌کند را مشخص سازد و در این آموزش قصد داریم تا با ذکر یک سری مثال،‌ این قابلیت زبان پی‌اچ‌پی را مورد بررسی قرار دهیم. برای شروع، داخل پوشهٔ oop پروژه‌ای تحت عنوان return-type-declaration ساخته و ساختار فولدربندی که در این دورهٔ آموزشی تاکنون مورد استفاده قرار داده‌ایم را در آن ایجاد می‌کنیم و در ادامه وارد پوشهٔ classes شده و فایلی تحت عنوان User.php داخل آن ساخته و متد زیر را داخلش می‌نویسیم:

<?php
namespace SokanAcademy;

class User
{
    public function returnUserAge($age)
    {
       return $age;
    }
}

پس از ساخت کلاسی به نام User، متدی ساخته‌ایم تحت عنوان ()returnUserAge که یک پارامتر ورودی می‌گیرد به نام age$ و در داخل بدنهٔ این متد نیز پارامتر ورودی‌اش را ریترن کرده‌ایم. جهت تست این متد، فایلی به نام index.php ساخته و آن را به صورت زیر تکمیل می‌کنیم:

<?php
ini_set('display_errors', '1');
require_once 'vendor/autoload.php';

$user = new SokanAcademy\User();
echo $user->returnUserAge(30);

به عنوان خروجی این فایل هم خواهیم داشت:

30

حال قصد داریم تا دستور دهیم که خروجی متد مذکور حتماً می‌باید عدد صحیح باشد؛ از همین روی،‌ کلاس User را به صورت زیر ریکفتور می‌کنیم:

public function returnUserAge($age): int
{
    return $age;
}

در واقع،‌ پس از علائم () از علامت : استفاده کرده و در ادامه کیورد int را آورده‌ایم. از این پس، مشخص کرده‌ایم که خروجی این متد فقط و فقط می‌باید عدد صحیح باشد اما اگر اکنون به فایل index.php بازگشته و مجدد آن را اجرا کنیم، در خروجی تغییر حاصل نخواهد شد چرا که آرگومان درستی برای این متد در نظر گرفته شده است. حال جهت تست این موضوع،‌ متد فوق را به صورت زیر تغییر می‌دهیم:

public function returnUserAge($age): int
{
    return $age + 1.1;
}

اگر به فایل index.php رفته و مجدد آن را اجرا کنیم، در خروجی خواهیم داشت:

31

در حقیقت،‌ آرگومان 30 برای این متد در نظر گرفته شده و داخل بدنهٔ این متد نیز عدد ۱/۱ نیز به آن افزوده شده که در نهایت می‌باید انتظار خروجی ۳۱/۱ را داشته باشیم اما می‌بینیم که این عدد رُند شده و به ۳۱ تغییر یافته است و علت این مسئله از آنجا ناشی می‌شود که در زبان پی‌اچ‌پی به طور پیش‌فرض قابلیت Strict Type غیرفعال است و همین مسئله باعث می‌گردد گاهی نتایج غیرمنتظره‌ای را شاهد باشیم که این موضوع را هیچ چیز بهتر از یک سری نمونه کد نشان نمی‌دهد به طوری که برای مثال داریم:

<?php
function add(int $one, int $two)
{
    echo $one + $two;
}
add(1, 2);

فانکشنی نوشته‌ایم به نام ()add که دو پارامتر ورودی از جنس int می‌گیرد و داخل بدنهٔ این فانکشن نیز این دو پارامتر را با یکدیگر جمع جبری کرده و خروجی را چاپ کرده‌ایم و زمانی هم که این فانکشن را با آرگومان‌های ۱ و ۲ مورد استفاده قرار می‌دهیممم، در خروجی شاهد عدد ۳ هستیم. در عین حال،‌ کد زیر نیز به درستی کار می‌کند:

<?php
function add(int $one, int $two)
{
    echo $one + $two;
}
add('1', '2');

می‌بینیم که در حین استفاده از فانکشن ()add از دو استرینگ به عنوان آرگومان استفاده کرده‌ایم اما در عین حال مفسر پی‌اچ‌پی به صورت خودکار آن‌ها را به عدد صحیح تبدیل کرده و با یکدیگر جمع می‌کند و مجدد خروجی ۳ را شاهد خواهیم بود. در کمال ناباوری، کد زیر نیز کار خواهد کرد البته دو هشدار هم در معرض دیدمان خواهد گذاشت:

<?php
function add(int $one, int $two)
{
    echo $one + $two;
}
add('1a', '2b');

برای آن که کاری کنیم تا مفسر پی‌اچ‌پی به صورت خودکار دیتا تایپ‌ها را به یکدیگر مبدل نسازد، می‌باید از دستور زیر در خط اول فایل استفاده کرد:

<?php
declare (strict_types = 1);
function add(int $one, int $two)
{
    echo $one + $two;
}
add('1', '2');

در صورت اجرای کد فوق،‌ در خروجی با ارور زیر مواجه خواهیم شد:

PHP Fatal error:  Uncaught TypeError: Argument 1 passed to add() must be of the type int, string given.

متن ارور حاکی از آن است که پارامتر اول فانکشن ()add می‌باید از جنس عدد صحیح باشد اما یک استرینگ پاس داده شده است. در واقع،‌ کاری که این دستور انجام می‌دهد آن است که قابلیت به اصطلاح Weak Type Checking پی‌اچ‌‌پی را به وضعیت Strict Type Checking قرار می‌دهد بدان معنا که دیتا تایپ‌ها می‌باید دقیقاً همانی باشند که در کد مشخص شده‌اند.

به خاطر داشته باشید
محل قرارگیری دستور (declare (strict_types = 1 می‌باید پس از علائم php?> و قبل از هر دستور دیگری باشد. همچنین توجه داشته باشیم که عملکرد این دستور بر پایهٔ هر فایل است؛ به عبارتی،‌ این قابلیت فقط در همان فایلی فعال می‌گردد که دستور فوق داخل آن درج شده است و روی دیگر بخش‌های سورس‌کد اِعمال نخواهد شد.

اگر مجدد به کلاس User بازگردیم، می‌بینیم که در صورت عدم استفاده از دستور (declare (strict_types = 1 کیورد int که این دستور را می‌دهد تا مقدار بازگشتی حتماً می‌باید عدد صحیح باشد کار نخواهد کرد که برای رفع این مشکل،‌ این کلاس را به صورت زیر آپدیت می‌کنیم:

<?php
declare (strict_types = 1);
namespace SokanAcademy;

class User
{
    public function returnUserAge($age): int
    {
        return $age + 1.1;
    }
}

حال اگر مجدد به فایل index.php بازگشته و آن را اجرا کنیم، خواهیم داشت:

/var/www/oop/return-type-declarations$ php index.php 
PHP Fatal error:  Uncaught TypeError: Return value of SokanAcademy\User::returnUserAge() must be of the type int, float returned in /var/www/oop/return-type declarations/classes/User.php:9

همان‌طور که انتظار می‌رفت،‌ متن ارور حاکی از آن است که مقدار بازگشتی متد ()returnUserAge می‌باید عدد صحیح باشد، اما یک عدد اعشاری ریترن شده است و در صورتی که این متد را به صورت زیر تغییر دهیم، این ارور نیز مرتفع خواهد شد:

public function returnUserAge($age): int
{
    return $age; // or return $age + 1; 
}

علاوه بر ریترن تایپ int که متد را موظف به بازگرداندن یک عدد صحیح می‌کند، ریترن‌ تایپ‌های دیگری نیز در زبان پی‌اچ‌پی ساپورت می‌شود که در ادامه آن‌ها را مورد بررسی قرار خواهیم داد.

این بخش از محتوا مخصوص کاربرانی است که ثبت‌نام کرده‌اند.
جهت مشاهدهٔ این بخش از محتوا لاگین نمایید.

جمع‌بندی
پس از عرضهٔ PHP 7 قابلیتی به این زبان افزوده شد به نام Return Type Declaration که بر آن اساس می‌توانیم دقیقاً مشخص سازیم یک تابع چه دیتا تایپی را می‌تواند به عنوان خروجی ریترن کند که از آن جمله می‌توان به bool ،string ،float ،int و ... اشاره کرد که در این آموزش به طور مفصل این موارد به علاوهٔ ریترن تایپ‌های دیگر توضیح داده شد.

دانلود فایل‌های تمرین

لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان