آشنایی با مفهوم Type Hinting در زبان پی اچ پی

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

برای مثال، برای آن که فانکشن خود را مجبور کنیم تا پارامتر ورودی اش از نوع Array (آرایه) باشد، می بایست از ساختار زیر تبعیت کنیم:


function functionName (array $argumentName) 
{
  //code
}

همان طور که در قطه کد بالا مشاهده می شود، قبل از پارامتر ورودی این فانکشن، از کلیدواژه ی array استفاده کرده ایم. از این پس، پارامتر argumentName$ همواره می بایست از نوع آرایه باشد و در غیر این صورت، با ارور مواجه خواهیم شد. حال در ادامه قصد داریم تا مفهوم تایپ هینتینگ را در قالب یک مثال عملی تست کنیم. قصد داریم فانکشنی بنویسیم تحت عنوان ()calculatePetrolCosumption به معنی «محاسبه ی میزان مصرف سوخت» و ورودی این فانکشن، می بایست آرایه یی از اطلاعات مرتبط با خودروهای مختلف باشد. پیش از هر چیز، آرایه یی حاوی اطلاعات چند خودرو به صورت زیر ایجاد می کنیم:


$models = array(
		array('pride', 6, 112),
		array('206', 7, 200),
		array('maxima', 14, 76)
	);

در آرایه ی models$، سه آرایه ی داخلی حاوی اطلاعات مرتبط با خودروهای پراید، 206 و ماگزیما را درج کرده ایم به این صورت که اندیس اول دربرگیرنده ی نام خودرو است، اندیس دوم حاوی مصرف سوخت در هر یکصد کیلومتر است و اندیس سوم یا آخر هم شامل مسافتی است که قرار است میزان مصرف سوخت آن را محاسبه کنیم. حال شروع به کدنویسی فانکشن خود می کنیم:


function calculatePetrolConsumption(array $models) 
{
    foreach ($models as $model) {
        echo $model[0];
        echo " consumes ";
        echo ($model[2] * $model[1]) / 100;
        echo " liters in $model[2] kilometers";
        echo "<br>";
    }
}

همان طور که مشاهده می شود، قبل از پارامتر ورودی model$ از کلیدواژه ی array استفاده کردیم که تا به فانکشن خود بفهمانیم که پارامتر ورودی باید فقط و فقط از تایپ آرایه باشد. سپس یک foreach روی آرایه ی خودروها زده ایم تا آن را به بخش های زیرشاخه تقسیم بندی کنیم. پیش از هر چیز، اندیس صفر آرایه که حاوی نام خودرو است را با استفاده از دستور echo چاپ می کنیم (نیاز به توضیح نیست که در زبان برنامه نویسی پی اچ پی، شمارش اندیس های هر آرایه بر خلاف ریاضیات روزمره یی که با آن سر و کار داریم، به جای یک، از صفر آغاز می شود.)

سپس استرینگ consumes به معنی «مصرف می کند» را نوشته و در خط بعد، الگوریتم محاسبه ی میزان مصرف سوخت بر اساس مسافت را می نویسیم. یک تناسب ساده بسته ایم به این شکل که گفته ایم مثلا پراید در هر یکصد کیلومتر شش لیتر بنزین مصرف می کند، حال در 112 کیلومتر چقدر مصرف خواهد کرد؟ ابتدا اندیس دوم که 112 است را در اندیس اول که 6 لیتر در هر یکصد کیلومتر است را ضرب کرده سپس حاصلضرب را بر 100 کیلومتر در هر ساعت تقسیم می کنیم (برای آن که کد تمیز تر باشد، بخش تقسیم اعداد بر یکدیگر را داخل پرانتز قرار داده ایم.)

در خط بعد هم ابتدا استرینگ liters in به معنی «لیتر در هر» را نوشته سپس اندیس دوم یا همان میزان مسافت را نوشته و در نهایت استرینگ kilometers به معنی «کیلومتر» را نوشته ایم. در نهایت هم یک تگ <br> را اکو کرده ایم تا در هر بار لوپ شدن، خروجی در یک خط مجزا چاپ شود. یک بار برنامه ی خود را اجرا می کنیم:


calculatePetrolConsumption($models);

خروجی برنامه ی بالا، به صورت زیر خواهد بود:


pride consumes 6.72 liters in 112 kilometers
206 consumes 14 liters in 200 kilometers
maxima consumes 10.64 liters in 76 kilometers

می بینیم که برنامه به درستی کار می کند. اکنون برای آن که عملکرد تایپ هینتیگ را بهتر درک کنیم، به جای یک پارامتر وروردی از نوع آرایه، یک استرینگ برای فانکشن خود در نظر می گیریم:


calculatePetrolConsumption('pride');

فایل را ذخیره کرده، و مرورگر را رفرش می کنیم:


Catchable fatal error: Argument 1 passed to calculatePetrolConsumption() must be of the type array, string given, called in /var/www/exercise/index.php on line 19 and defined in /var/www/exercise/index.php on line 9

همان طور که از ارور بالا مشخص است، مفسر PHP به ما اعلام می کند که فانکشن ()calculatePetrolConsumption یک پارامتر ورودی از نوع آرایه می گیرد اما ما پارامتری از نوع استرینگ به آن پاس داده ایم. در ادامه، می خواهیم ببینیم که تایپ هینتینگ در مورد کلاس ها به چه شکل است. برای این منظور، دو کلاس به صورت زیر تحت عناوین Site و World می سازیم:


class Site
{
    public function __construct()
    {
	echo 'Hello SokanAcademy.com';
    }
}

class World
{
    public function __construct()
    {
	echo 'Hello World';
    }
}

داخل هر دوی کلاس ها، فانکشنی از نوع کانستراکتور ساخته ایم (توجه داشته باشیم که وظیفه ی کانستراکتورها این است که به محض ساخت شدن یک آبجکت از روی کلاسی که داخل آن قرار گرفته اند، به صورت خودکار فراخوانی می شوند.)  وظیفه ی کانستراکتور قرار گرفته در کلاس Site این است که استرینگ Hello SokanAcademy.com را نمایش دهد و کانستراکتور قرار گرفته داخل کلاس World این وظیفه را دارا است تا استرینگ Hello World را چاپ کند. حال فانکشنی تحت عنوان ()showResult به معنی «نتیجه را نمایش بده» ساخته با این شرط که پارامتر ورودی آن باید آبجکتی از نوع کلاس Site باشد:


function showResult(Site $className)
{
    // more statements code here
}

برای تست کردن برنامه ی خود، ابتدا یک آبجکت از روی کلاس Site ساخته و نام آن را obj$ می گذاریم. سپس این آبجکت را به عنوان پارامتر ورودی فانکشن ()showResult در نظر می گیریم:


$obj = new Site();
showResult($obj);

خروجی دستورات بالا به صورت زیر است:


Hello SokanAcademy.com

با توجه به این که تایپ پارامتر ورودی این فانکشن آبجکتی از روی کلاس Site است و پیش از هم گفته بودیم که پارامتر ورودی فقط و فقط باید آبجکتی از روی این کلاس باشد، برنامه بدون هیچ مشکلی اجرا می شود. اکنون می خواهیم آبجکتی از روی کلاس World ساخته و به این فانکشن پاس دهیم:


$worldObject = new World();
showResult($worldObject);

همان طور که در بالا مشخص است، آبجکتی تحت عنوان worldObject$ از روی کلاس World ساخته ایم و آن را به عنوان پارامتر ورودی، به فانکشن ()showResult پاس داده ایم. خروجی دستور بالا به صورت زیر خواهد بود:


Catchable fatal error: Argument 1 passed to showResult() must be an instance of Site, instance of World given, called in /var/www/exercise/index.php on line 29 and defined in /var/www/exercise/index.php on line 21

می بینیم که با یک Fatal Error مواجه شده ایم چرا که ما فقط اجازه داریم تا پارامتر ورودی این فانکشن از آبجکتی از روی کلاس Site در نظر بگیریم.

به طور کلی، Type Hinting در زبان برنامه نویسی PHP این امکان را به ما می دهد تا روی برنامه های خود کنترل بیشتری داشته و ساختارهای اصولی تر پیاده سازی کنیم.

Learn Type Hinting

0


بهزاد مرادی

از جمله علائقم می‌شه به نشر علم،‌ سرمایه‌گذاری روی نسل آینده، برنامه‌نویسی به خصوص زبان PHP و جامعهٔ اپن‌سورس و همچنین راه‌اندازی استارتاپ و کارآفرینی اشاره کرد و اعتقاد دارم که سکان آکادمی می‌تونه بستری باشه که از اون طریق به علائقم جامهٔ عمل بپوشونم!






از طریق این فرم، می توانید بدون ثبت نام نظر دهید و یا اگر قبلا ثبت نام کرده اید، با ورود ناحیه ی کاربری می توانید علاوه بر ثبت نظر، به مدیریت نظرات خود نیز بپردازید.
(فیلد اجباری)
(فیلد اجباری)
(فیلد اجباری)
(فیلد اجباری)