توابع از جمله مهمترین مباحثی است که در آموزش پیاچپی باید یاد بگیرید. این مبحث علیرغم اهمیت بالا و کاربرد فراوان بسیار آسان و لذت بخش است. پس خود را برای یک سفر کوتاه اما به یاد ماندنی در دنیای PHP آماده کنید.
تابع (Function) چیست؟
اگر درس ریاضیات دوران دبیرستان خود را بیاد داشته باشید، تابع را به ماشینی تشبیه میکردیم که یک ورودی را گرفته و سپس عملیات خاصی را بر روی آن انجام داده و در نهایت یک خروجی را تولید میکند. در پیاچپی نیز تعریف تابع همین است و توابع این زبان برنامهنویسی یک داده ورودی را دریافت میکنند، عملیات مورد نظر ما را بر روی آن داده یا دادهها انجام داده و نهایتا خروجی مورد نظرمان را تولید میکنند. در شکل زیر به سادهترین حالت ممکن روش عملکرد تابع را برای شما رسم کردهام:
دو نوع تابع در php داریم. یکی توابع پیشفرض و دیگری توابع تعریف شده توسط کاربر. توابع پیشفرض همان دستوراتی هستند که از قبل توسط php برای استفاده ما ایجاد و تعریف شدهاند. به عنوان مثال میتوان دستور echo را یک تابع ساده دانست. تا کنون بارها و بارها در طی جلسات قبلی از این دستور استفاده کردهایم. این دستور ورودی را از ما گرفته و آن را بدون هیچ تغییر خاصی چاپ میکند!
نکات بسیار مهم:
- بر خلاف نام متغییرها که پیش از این گفتم به بزرگ و کوچک بودن حروف حساس هستند، اما در نام توابع بزرگ و کوچک نوشتن نام هیچ تاثیری در عملکرد آن نخواهد داشت و در نتیجه شما برای استفاده از یک تابع چه آن را با حروف بزرگ بنویسید و چه با حروف کوچک، نتیجه کار یکسان خواهد بود.
- نام تابع را میتواند با یک حرف یا علامت آندرلاین (ـ) شروع شود.
- تا هنگامی که تابع فراخوانی نشود کد داخل آن اجرا نخواهد شد.
ساختار کلی یک تابع در پیاچپی
و اما ساختار کلی یک تابع در پیاچپی به صورت زیر خواهد بود:
function MyFunc (){//some oprates on code!}?>
همانطور که در کد بالا میبینید برای تعریف یک تابع ابتدا باید کلمه کلیدی function را نوشته و سپس نام مورد نظر را برای تابع تایپ کنیم. سپس در صورتی که تابع ما نیاز به ورودی داشته باشد باید آنها را در پرانتز مقابل نام تابع تعریف کنیم. در نهایت نیز عملیاتی که باید بر روی دادهها انجام شود بین } و { قرار داده میشود. دقت کنید در کد بالا ما نام تابع را MyFunc قرار دادهایم و این نام دلخواه است. فقط باید توجه داشته باشید در نامگذاری توابعی که تعریف میکنید، کلمات کلیدی پیاچپی نظیر دستورات پیشفرض را به عنوان نام تابع نمیتوانید انتخاب کنید.
در پیاچپی میتوان توابعی تعریف کرد که نیاز به ورودی نداشته باشند و این نوع تابعها در واقع سادهترین نوع ممکن توابع به حساب میآیند. به مثال زیر دقت کنید:
//define funcfunction bigHello(){ echo "hello!";}//call or using funcbigHello();?>
در کد بالا ابتدا یک تابع به نام bigHello را معرفی کردیم و کد داخل آن را چاپ عبارت hello در بین تگ h1 تعیین کردهایم. اما همانطور که اشاره شد تا زمانی که تابع را فراخوانی نکنیم هیچ اتفاقی نخواهد افتاد و به همین دلیل در خط بعدی با نوشتن نام تابع به صورتی که مشاهده میکنید آن را فراخوانی کرده ایم. نتیجه کد بالا چاپ عبارت Hello! در بین تگ h1 خواهد بود. حال شما میتوانید به هر تعداد که میخواهید این تابع را فراخوانی کنید و طبیعتا به ازای هر بار فراخوانی تابع، یکبار کد داخل آن اجرا میشود.
این یکی از دلایل شیرین بودن مبحث توابع است که در اول مطلب اشاره کردم. شما یکبار کد مورد نظر را مینویسید و سپس میتوانید هر چقدر که نیاز داشته باشید از آن در پروژه خود استفاده کنید. در پروژههای بزرگتر استفاده از توابع باعث میشود تا کدنویسی شما به حداقل برسد.
پارامترها در توابع یا همان ورودی توابع
حالت استاندارد توابع همانطور که گفتیم این است که یک یا چند ورودی دریافت کند. ورودیها را میتوان از طریق پارامترها به تابع ارسال کرد. برای این منظور به ازای هر ورودی که نیاز داریم تابع آنها را دریافت کند، یک متغییر به همان روشی که متغییرها را تعریف میکردیم در داخل پرانتز مقابل نام تابع، وارد کنیم. به مثال زیر توجه کنید:
function myFunc ($name, $age){ echo "your name is $name and your age is $age";}myFunc("mojtaba", "25");?>
تابع بالا دو پارامتر ورودی دریافت میکند و مقدار آنها را در متغییرهایی که خود تعریف کردهایم قرار میدهد. در مثال بالا نام و سن کاربر توسط تابع ما دریافت میشود و سپس جمله مورد نظر نام و سن کاربر را اعلام میکند. همانطور که مشاهده میکنید برای استفاده از این تابع ابتدا نام آن را نوشته و سپس ورودیهای آن را در پرانتز مقابلش وارد میکنیم. از آنجا که تابع ما نیاز به دو پارامتر ورودی دارد، پس هر پارامتر را با یک کاما از دیگری جدا میکنیم. اگر نیاز به تعداد ورودی بیشتر داشته باشیم باید به همین صورت آنها را با کاما از هم جدا کنید.
اگر در کد بالا، به جای دو ورودی، یک ورودی را وارد کنید، با خطای پیاچپی مواجه خواهید شد چراکه کامپایلر php در این شرایط نیاز دارد تا دو ورودی به تابع ما ارسال شود.
برای درک بهتر ورودیها در توابع به مثال دیگری توجه کنید. قصد داریم یک تابع بنویسیم که دو عدد را از کاربر گرفته و آنها را در هم ضرب و سپس نتیجه را چاپ کند.
function Zarb ($a, $b){ $c = $a * $b; echo $c;}//using our Zarb FunctionZarb (3, 5);?>
نتیجه اجرای کد بالا چاپ عدد 15 در مروگر کاربر خواهد بود. در مثال بالا ابتدا دو ورودی از کاربر گرفته و آنها را در متغییرهایی به نام a و b ذخیره کردهایم. سپس یک متغییر داخلی به نام c در تابع خود تعریف میکنیم و مقدار حاصل از ضرب a و b را در آن قرار میدهیم. سپس مقدار c را به عنوان خروجی تابع چاپ میکنیم.
استفاده از آرگومانهای ورودی پیشفرض در توابع
در مثالهای قبل همانطور که اشاره کردیم به تعداد پارامترهای ورودی که برای هر تابع تعریف میکنیم، باید در هنگام فراخوانی آن تابع، به همان تعداد ورودی برای آن تعریف کنیم. اما میتوانید یک مقدار پیشفرض برای هر کدام از ورودیهای تابع تعریف کنیم تا در صورتی که کاربر آن ورودی را تعریف نکرد، اسکریپت نوشته شده توسط ما با خطا مواجه نشود.
به مثال زیر دقت کنید:
function myFunc ($name = "mojtaba"){ echo $name;}myFunc();?>
در کد بالا همانطور که میبینید ما یک آرگومان ورودی برای تابع خود تعریف کردهایم. اما اینبار یک مقدار پیشفرض را نیز به آن نسبت دادهایم. سپس تابع را فراخوانی کردهایم ولی هیچ آرگومانی را به آن نسبت ندادهایم! در این حالت دیگر با خطای پیاچپی مواجه نخواهیم شد چراکه مقدار پیشفرض متغییر name چاپ خواهد شد.
مقادیر بازگشتی در توابع
تا اینجای کار ما خروجی توابع مورد نظرمان را چاپ میکردیم. اما گاهی در کدنویسی شرایطی پیش میآید که نیاز به مقدار بازگشتی یک تابع داریم. اما مقدار بازگشتی یعنی چه؟ در تعریف متغییرها اگر به یاد داشته باشید گفتیم که هر متغییر یک مقدار را در خود جای داده است. حال اگر بخواهیم خروجی یک تابع را در یک متغییر ذخیره کنیم تا بتوانیم بعدا اعمال دیگری را بر روی آن انجام دهیم، در این شرایط استفاده از روشهای بالا به کارمان نمیآید.
در مثال زیر میخواهیم یک تابع تعریف کنیم که دو عدد را از ورودی گرفته و آنها را در هم ضرب میکند. اما اینبار به جای چاپ خروجی، مقدار نهایی حاصلضرب دو عدد ورودی را به صورت یک متغییر خروجی بازگشت میدهد.
function Zarb($a, $b){ $c = $a * $b; return $c;}echo Zarb(2,3);?>
خب در مثال بالا همانطور که توضیح دادیم یک تابع با دو آرگومان ورودی تعریف کردهایم. سپس در تابع دو ورودی را در هم ضرب میکنیم و نتیجه را در متغییری به نام c قرار میدهیم. اینبار به جای چاپ مستقیم متغییر c با استفاده از کلمه کلیدی return آن را بازگشت میدهیم. در این صورت برای دسترسی به مقدار خروجی این تابع باید آن را خودمان با دستور echo چاپ کنیم. در مثال بالا میبینید که برای چاپ حاصلضرب دو عدد ۲ و ۳ نام تابع را در مقابل دستور echo آورده ایم. در واقع در این شرایط تابع ما برابر است با مقدار متغیر c که در مورد مثال بالا نتیجه کار عدد ۶ خواهد بود.
برای درک بهتر مقدار بازگشتی در توابع به مثال زیر توجه کنید:
function Zarb($a, $b){ $c = $a * $b; return $c}$d = Zarb(5,4);echo $d;?>
در مثال بالا برای روشنتر شدن موضوع ابتدا مقدار بازگشتی تابع Zarb را در متغیری به نام d ریختهایم و سپس مقدار d را با دستور echo چاپ کردهایم. نهایتا خروجی کد بالا عدد ۲۰ خواهد بود. حالا احتمالا به خوبی مفهوم مقدار بازگشتی در توابع را یاد گرفتهاید.
مبحث توابع نیز در این لحظه به پایان رسید. برای تمرین این جلسه سعی کنید چند تابع با کاربردهای مختلف برای خود بنویسید و از آنها در کدهای خود استفاده کنید. همچنین سعی کنید توابعی بنویسید که مقدار بازگشتی داشته باشند و سپس با مقادر بازگشتی همانند مثال بالا، عملیات خاصی را انجام دهید.
در جلسه بعد اولین پروژه عملی این دوره آموزشی را با هم ایجاد خواهیم کرد و در هر جلسه علاوه بر یادگیری مباحث جدید و کاربردی، پروژه خود را کاملتر میکنیم. همچنین در صورتی که سوالی در مورد مباحث این جلسه دارید آن را در بخش نظرات اعلام کنید.