تابع در PHP – تعریف، نحوه فراخوانی و ترفندها به زبان ساده

«تابع» (Function) یکی از مهمترین مفاهیم موجود در دنیای برنامه نویسی است. استفاده از توابع موجب کد نویسی کمتر و خوانایی بیشتر برنامه میشود و به برنامهنویسان امکان نوشتن کدهای استاندارد با قابلیت استفاده مجدد را میدهد. این مفهوم و نحوه استفاده و تعریف آن در اکثر زبانهای برنامه نویسی مشترک است. تابع در زبان PHP نیز عملکردی مشابه با سایر زبانهای برنامه نویسی دارد و به برنامهنویس امکان استفاده چند باره از یک قطعه کد را میدهد. بر همین اساس در این مطلب از مجله فرادرس به بررسی موارد مهمی از جمله تعریف و فراخوانی تابع در PHP، مزایای استفاده از تابع و انواع آن پرداختهایم.
علاوه بر این، با مطالعه این مطلب نکات بسیار مهمی در خصوص تعریف تابع در PHP همچون «آرگومان» (Argument)، پارامتر، مقادیر بازگشتی، پارامترهای پیشفرض، دامنه تابع و سایر موارد خواهید آموخت. همچنین، سعی شده است تا با ارائه مثالها و قطعه کدهای مرتبط درک مباحث گفته شده آسانتر شود.
مفهوم تابع چیست؟
تابع در برنامه نویسی به بلوکی از کدهای مستقل و قابل استفاده مجدد اشاره دارد که با توجه به نیاز برنامهنویس کار مشخصی را انجام میدهند. اکثر زبانهای برنامه نویسی از مفهوم تابع پشتیبانی میکنند، زیرا استفاده از تابع در برنامه نویسی ضمن کوتاهتر کردن کدهای نوشته شده موجب خوانایی بهتر و رفع اشکال آسانتر از کد نیز میشود. علاوه بر این، با توجه به امکان فراخوانی چند باره توابع میتوان گفت که توابع به بهبود قابلیت استفاده مجدد کد نیز کمک میکنند.
مهمترین اجزای ساختار تابع کدامند؟
توابع در دیگر شاخههای علمی همچون فیزیک و ریاضیات نیز کاربرد دارند و تقریباً ساختار اصلی تعریف و استفاده از تابع در حوزههای مختلف یکسان است. به طور کلی توابع معمولاً ورودی مشخصی را دریافت میکنند و بعد از انجام عملیات تعیین شده بر روی اطلاعات ورودی، خروجی مورد نظر را بر میگردانند.
عملیات انجام شده بر روی دادههای ورودی به تابع رابطه بین ورودی و خروجی را مشخص میکند. بر همین اساس، ۳ بخش اصلی تشکیل دهنده هر تابعی عبارتند از:
- ورودی
- رابطه بین ورودی و خروجی
- خروجی
مفهوم تابع در PHP
زبان برنامه نویسی PHP نیز همانند سایر زبانهای برنامه نویسی معروف از مفهوم تابع پشتیبانی میکند. در واقع، استفاده از کدهای یکسان در بخشهای مختلف پروژه خوانایی کلی برنامه را کاهش میدهد.
بر همین اساس، یکی از اصول مهم برنامه نویسی تحت عنوان «خودت را تکرار نکن» (Dont Repeat Yourself | DRY) به همین موضوع اشاره دارد. استفاده از متغیرها در برنامه نویسی از نوشتن مکرر دادههای یکسان جلوگیری میکند و توابع در برنامه نویسی نیز از نوشتن چند باره یک عملکرد جلوگیری میکنند.
مزایای استفاده از تابع در PHP چیست؟
استفاده از توابع در برنامه نویسی مزایای بسیاری را به دنبال دارد. در ادامه به ۳ مورد از مهمترین مزایای استفاده از تابع در PHP اشاره شده است.
- قابلیت استفاده مجدد کد: تعریف تابع در PHP تنها یک مرتبه صورت میگیرد و میتوان تابع تعریف شده را چندین بار فراخوانی کرد.
- کدنویسی کمتر: استفاده از توابع حجم کدهای برنامه را نیز کاهش میدهد، زیرا در این صورت منطق اصلی برنامه تنها یک مرتبه نوشته میشود و میتوان چندین مرتبه آن را فراخوانی کرد.
- درک آسان: استفاده از تابع در PHP منجر به جدا شدن منطق پیادهسازی برنامه میشود. تقسیم شدن منطق برنامه در قالب توابع مختلف به درک آسانتر جریان برنامه میانجامد.
- افزایش سرعت توسعه: برنامهنویسان با توجه به قابلیت استفاده مجدد توابع میتوانند برای افزایش سرعت توسعه برنامه از توابع پیش ساخته استفاده کنند.
انواع تابع در PHP
همان طور که پیشتر نیز عنوان شد، توابع قطعه کدهایی هستند که با پردازش اطلاعات ورودی، خروجی مورد انتظار را ارائه میکنند. مهمترین ویژگی توابع نیز قابلیت استفاده مجدد آنها است که موجب کاهش خطوط کد و افزایش خوانایی برنامه میشوند.
در زبان برنامه نویسی PHP به طور پیشفرض بیش از ۱۰۰۰ تابع داخلی وجود دارد که هر کدام برای انجام عملیاتی خاص در نظر گرفته شده است. علاوه بر این، برنامه نویس نیز با توجه به نیاز پروژه امکان تعریف تابع در PHP را دارد. بر همین اساس، توابع در PHP به دو دسته کلی زیر تقسیم میشوند.
- «توابع داخلی» (Built-in Function)
- «توابع تعریف شده توسط کاربر» (User-Defined Functions)
در ادامه این مطلب به طور کامل به بررسی هر دو نوع تابع موجود در PHP خواهیم پرداخت. همچنین، مواردی همچون تعریف تابع در PHP و نحوه استفاده و فراخوانی تابع در PHP به همراه جزئیات کامل مورد بررسی قرار خواهد گرفت.
توابع تعریف شده توسط کاربر
توابع تعریف شده توسط کاربر رایجترین و پرکاربردترین نوع از توابع هستند که با توجه به عنوان خود به طور کامل توسط برنامهنویس تعریف میشوند. در واقع، بسیاری از افراد با شنیدن نام تابع به طور ناخودآگاه این دست از توابع را در ذهن خود تجسم میکنند.
برنامهنویس برای تعریف تابع در PHP ابتدا نیاز پروژه را در نظر میگیرید و سپس، نسبت به تعیین ساختار و پیادهسازی تابع مورد نظر اقدام میکند. در انتها نیز برای استفاده از تابع باید آن را فراخوانی کند. در ادامه این بخش از نوشته تمام مراحل مورد نیاز برای تعریف و فراخوانی تابع در PHP عنوان شده است.
تعریف تابع در PHP
برای نوشتن تابع در PHP ابتدا باید ساختار آن ایجاد شود. در پیادهسازی ساختار تابع در PHP نکات زیر را باید رعایت کرد.
- قبل از نوشتن نام تابع باید کلمه کلیدی function را قرار داد.
- نام تابع نباید با یک کاراکتر عددی شروع شود.
- برای تعیین نام تابع دستورالعمل مشخصی وجود ندارد، ولی برای بهبود خوانایی کد و کاهش پیچیدگیهای کد نویسی بهتر است که تابع با توجه به عملکرد آن نامگذاری شود.
- بعد از نام تابع پرانتزهای باز و بسته () برای تعیین ورودیهای آن قرار داده میشوند.
- کدهای مربوط به تابع نیز باید درون کروشههای باز و بسته قرار گیرند.
با توجه به نکات ارائه شده در بالا، قطعه کد زیر ساختار استاندارد تعریف تابع در PHP را نشان میدهد.
<?php
function hello() {
echo "Hello World!";
}
در قطعه کد بالا تابع با نام hello() تعریف شده است که به کمک دستور echo عبارت Hello World! را در خروجی چاپ میکند.
فراخوانی تابع در PHP
توابع تعریف شده در PHP تا زمان فراخوانی توسط کاربر هیچ کاری نمیدهند و خروجی نیز نخواهند داشت. برای فراخوانی تابع در PHP از نام تابع به همراه پرانتزهای مربوط به آن استفاده میشود. به عنوان مثال، در قطعه کد زیر فراخوانی مربوط به تابع hello() در مثال قبل آورده شده است.
<?php
function hello() {
echo "Hello World!";
}
hello();
با فراخوانی تابع hello() در مثال بالا عبارت Hello World! در خروجی چاپ خواهد شد.
Output Hello World!
نمونه کد بالا تعریف و فراخوانی تابع در PHP را با مثالی ساده نشان داد. البته این نمونه کد مثال خوبی از کاربرد تابع نبود، زیرا هیچ گونه ورودی و رابطهای در تابع وجود نداشت و تنها عبارتی در خروجی چاپ شد. در ادامه مطلب به بررسی تعریف تابع به همراه ورودیهای مختلف و نحوه قرارگیری آنها در تابع پرداخته خواهد شد.
تفاوت آرگومان و پارامتر چیست؟
قبل از بررسی نحوه استفاده از ورودیهای مختلف در توابع بهتر است به این سوال پاسخ داده شود که تفاوت «آرگومان» (Argument) و «پارامتر» (Parameter) چیست. این دو واژه در بحث مربوط به ورودیهای تابع بسیار مورد استفاده قرار میگیرند. بسیاری از افراد این دو واژه کاملاً متفاوت را به صورت یکسان در نظر میگیرند. در واقع، پارامترها متغیرهایی هستند که هنگام تعریف تابع به عنوان ورودی مشخص میشوند. از سویی دیگر، آرگومانها متغیرهایی هستند که هنگام فراخوانی توابع به آنها ارسال میشوند.
مثالی از کاربرد پارامتر و آرگومان در تعریف تابع در PHP
برای درک بهتر این دو مفهوم مثال مربوط به تابع hello() را در نظر بگیرید. در این مثال، برای ایجاد ارتباط بین ورودی و خروجی تابع باید مقداری به عنوان پارامتر ورودی تابع تعریف شود. این پارامتر را باید به عنوان متغیر بین پرانتزهای تعریف تابع قرار داد.
<?php
function hello($name) {
echo "Hello ".$name;
}
hello();
در قطعه کد بالا متغیر $name به عنوان پارامتر ورودی تابع hello() مشخص شده است. سپس، این متغیر در بدنه تابع به رشته Hello الحاق شده است. در ادامه نیز تابع hello() همانند قبل فراخوانی شده است. در نتیجه، خطای زیر نشان داده خواهد شد، زیرا این تابع نیاز به پارامتر ورودی دارد.
Output Warning: Uncaught ArgumentCountError: Too few arguments to function hello(), 0 passed in php shell code on line 1 and exactly 1 expected
تابع hello() برای اجرای صحیح در زمان فراخوانی نیاز به تعیین آرگومان ورودی دارد تا متغیر $name مقداردهی شود. نمونه کد زیر شکل صحیح فراخوانی تابع hello() به همراه آرگومان ورودی را نشان میدهد.
<?php
function hello($name) {
echo "Hello ".$name;
}
hello("Sammy");
خروجی حاصل از اجرای نمونه کد بالا با توجه به آرگومان ارسالی به تابع به صورت زیر خواهد بود.
Output Hello Sammy
این آرگومانها در PHP تحت عنوان «آرگومانهای اجباری» (Positional Arguments) شناخته میشوند، زیرا باید با همان ترتیب مشخص شده در زمان تعریف تابع ارسال شوند.
پارامترهای پیشفرض اختیاری
به طور پیشفرض پارامترهای مشخص شده در زمان تعریف تابع باید توسط آرگومانهای ارسالی در زمان فراخوانی تابع مقداردهی شوند. ارسال مقادیر مختلف تحت عنوان آرگومانهای ورودی سبب میشود تا خروجی تابع با استفاده از دادههای مختلف منحصر به فرد شود. هنگام فراخوانی تابع در PHP همیشه نیاز به ارسال مقداری منحصر به فرد برای تمام پارامترهای ورودی نیست. به جای این مورد میتوان برخی پارامترهای تابع را به صورت پیشفرض تعیین کرد و مقداری پیشفرض را نیز برای آنها در نظر گرفت. این مقدار زمانی مورد استفاده قرار میگیرد که در زمان فراخوانی تابع آرگومانی برای ارسال مشخص نشده باشد. نمونه کد زیر نحوه استفاده از پارامترهای پیشفرض نشان میدهد.
<?php
function hello($name, $greeting = "Hello") {
echo $greeting." ".$name;
}
hello("Sammy", "Bonjour");
در مثال بالا پارامتر دوم یعنی $greeting در تعریف تابع hello() به عنوان پارامتر پیشفرض با مقدار Hello مشخص شده است. در نتیجه، در صورت عدم تخصیص مقدار به این پارامتر هنگام فراخوانی تابع، به صورت پیشفرض مقدار Hello برای آن در نظر گرفته میشود. خروجی حاصل از اجرای نمونه کد بالا به صورت زیر است.
Output Bonjour Sammy
با توجه به این که در فراخوانی تابع hello() در مثال بالا برای پارامتر پیشفرض آرگومان ارسالی مشخص شده است، تابع از مقدار ارسال شده استفاده میکند. در مثال زیر هنگام فراخوانی تابع hello() تنها یک آرگومان مشخص شده است.
<?php
function hello($name, $greeting = "Hello") {
echo $greeting." ".$name;
}
hello("Sammy");
خروجی حاصل از اجرای نمونه کد بالا به صورت زیر خواهد بود.
Output Hello Sammy
در این مثال به دلیل ارسال تنها یک آرگومان در فراخوانی تابع، از مقدار پیشفرض مشخص شده در تعریف تابع برای پارامتر دیگر استفاده شده است.
پارامترهای تهی اختیاری
پارامترهای کاملاً اختیاری در تعریف تابع نیاز به هیچ مقدار پیشفرضی ندارند. در نتیجه، میتوان برای این دست از پارامترها مقدار null را قرار داد. نمونه کد زیر تابع به همراه پارامتر تهی اختیاری را نشان میدهد.
<?php
function hello($name, $greeting = "Hello", $punctuation = null) {
echo $greeting." ".$name.$punctuation;
}
hello("Sammy");
در بدنه تابع فوق متغیرهای مربوط به پارامترهای ورودی به صورت رشته به یکدیگر الحاق شدهاند. خروجی حاصل از اجرای نمونه کد بالا به صورت زیر خواهد بود.
Output Hello Sammy
در فراخوانی تابع hello() در مثال بالا تنها یک آرگومان به عنوان ورودی تابع ارسال شده است. پارامتر $greeting دارای مقدار پیشفرض Hello و پارامتر $punctuation دارای مقدار پیشفرض تهی است. در نتیجه، پارامتر $punctuation مقداری را برگشت نمیدهد.
مقادیر بازگشتی
به طور پیشفرض توابع مقداری را در خروجی چاپ میکنند. برای انعطافپذیری بیشتر در توابع میتوان به جای چاپ خروجی از مقادیر بازگشتی استفاده کرد.
در این حالت باید خروجی حاصل از اجرای تابع را به قسمتی از کد که تابع را فراخوانی کرده، برگشت داد. برای این منظور همانند قطعه کد زیر باید از کلمه کلیدی return به جای کلمه کلیدی echo استفاده کرد.
<?php
function hello($name, $greeting = "Hello", $punctuation = null) {
return $greeting." ".$name.$punctuation;
}
hello("Sammy");
echo hello("Sammy");
در قطعه کد بالا تابع hello از مقادیر بازگشتی استفاده میکند. بر همین اساس، در اولین مرتبه فراخوانی این تابع با وجود اجرای تابع اتفاقی رخ نمیدهد، زیرا متغیری برای ذخیره مقدار بازگشتی از تابع تعریف نشده است. در فراخوانی دوم تابع اما از کلمه کلیدی echo قبل از نام تابع استفاده شده است که موجب چاپ مقادیر بازگشتی از تابع در خروجی میشود. خروجی حاصل از اجرای نمونه کد بالا در ادامه آورده شده است.
Output Hello Sammy
البته ذکر این نکته نیز ضروری است که همیشه نیاز به چاپ خروجی تابع نیست و میتوان مقدار بازگشتی را در متغیر دیگری ذخیره کرد. همچنین، امکان ارسال مقدار بازگشتی از تابع به عنوان آرگومان ورودی به تابعی دیگر نیز وجود دارد.
فراخوانی یک تابع در تابع دیگر
توابع بلوکهایی از کد با قابلیت استفاده مجدد هستند. بیشتر کدهای نوشته شده در خارج از تابع میتوانند در قالب یک تابع جدید نوشته شده و در داخل تابع اصلی فراخوانی شوند. با این وجود تنها در موارد ضروری میتوان توابع را به صورت تو در تو تعریف کرد و تا حد امکان باید از پیچیده شدن بیش از حد کد جلوگیری کرد. به عنوان مثال، در قطعه کد زیر توابع به صورت تو در تو تعریف شدهاند.
<?php
function hello($name, $greeting = "Hello", $punctuation = null) {
$name = ucwords(strtolower($name));
return $greeting." ".$name.$punctuation;
}
echo hello("SAMMY");
در اولین خط از بدنه تابع hello در نمونه کد بالا به کمک فراخوانی تابع strtolower() رشته $name به حروف کوچک تبدیل میشود. در ادامه نیز با فراخوانی تابع ucwords() اولین حرف از رشته $name به حروف بزرگ تبدیل خواهد شد. در نتیجه، با فراخوانی تابع hello() خروجی با فرمتی استاندارد و بدون توجه به ورودی دریافتی برگشت داده میشود. خروجی حاصل از اجرای نمونه کد بالا به صورت زیر است.
Output Hello Sammy
توجه به نوع دادهای پارامترهای تابع
یکی از مهمترین نکات در خصوص فراخوانی تابع در PHP توجه به نوع دادهای پارامترهای مشخص شده در تعریف تابع است. در زمان فراخوانی تابع باید نوع دادهای آرگومانهای ارسالی با نوع دادهای مشخص شده برای پارامترها در تعریف تابع مطابقت داشته باشد.
در صورت عدم تطابق نوع دادهای آرگومانها و پارامترها کد نوشته شده با خطای TypeError روبرو خواهد شد. برای بررسی بروز این خطا در زمان فراخوانی تابع hello() به جای ارسال آرگومان از نوع رشته یک آرایه به تابع ارسال شده است. نمونه کد زیر این مسئله را نشان میدهد.
<?php
function hello(string $name, $greeting = "Hello", $punctuation = null) {
$name = ucwords(strtolower($name));
return $greeting." ".$name.$punctuation;
}
echo hello(["Sammy", "World"]);
در نمونه کد بالا ارسال آرایه به جای رشته در فراخوانی تابع hello() منجر به بروز خطا شده و اجرای کد را متوقف میکند. متن مربوط به خطا در ادامه آورده شده است.
Output Warning: Uncaught TypeError: Argument 1 passed to hello() must be of the type string, array given
متن خطا به صورت کاملاً واضح مشخص کرده است که آرگومان ارسالی به تابع به جای رشته از نوع آرایه ارسال شده است.
توجه به نوعبندی سست زبان PHP
زبان برنامه نویسی PHP یک زبان با «نوعبندی سست» (Loosely Typed) است. منظور از این عنوان برای زبان PHP این است که حساسیت زیادی در خصوص نوعهای دادهای ندارد و امکان انجام هر عملی بر روی متغیرهای مختلف را فراهم میکند. به عنوان مثال، در زبان PHP میتوان متغیری از نوع رشته را با متغیری از نوع عددی جمع کرد. این مسئله در بحث آرگومانهای ارسالی به تابع نیز وجود دارد. برای این منظور نمونه کد زیر را در نظر بگیرید.
<?php
function hello(string $name, $greeting = "Hello", $punctuation = null) {
$name = ucwords(strtolower($name));
return $greeting." ".$name.$punctuation;
}
echo hello(123);
همانند بخش قبلی در فراخوانی تابع hello() نوع دادهای آرگومان ارسالی و پارامتر ورودی تابع مطابقت ندارد. در نتیجه، باید انتظار بروز خطا به دلیل عدم تطابق نوع دادهای را داشت. با این وجود به دلیل نوعبندی سست زبان PHP متغیر عددی به متغیر رشته تبدیل میشود و کد مورد نظر بدون خطا اجرا میشود. خروجی حاصل از اجرای کد بالا به صورت زیر است.
Output Hello 123
نوعهای دادهای سختگیرانه
ویژگی نوعبندی سست در PHP و حساسیت کم این زبان برنامه نویسی نسبت به نوعهای دادهای گاهی اوقات میتواند باعث بروز اشکالاتی در کد شود. بر همین اساس و به منظور بهبود خوانایی کد نوشته شده زبان PHP امکانی را جهت افزایش حساسیت آن نسبت به نوعهای دادهای فراهم کرده است. برای این منظور در بالای فایل PHP با افزودن اعلان باید حساسیت نوع را تعیین کرد. در نمونه کد زیر این مسئله در نظر گرفته شده است.
<?php
declare(strict_types=1);
function hello(string $name, $greeting = "Hello", $punctuation = null) {
$name = ucwords(strtolower($name));
return $greeting." ".$name.$punctuation;
}
echo hello(123);
بعد از اجرای نمونه کد بالا خروجی زیر نشان داده میشود.
Output PHP Fatal error: Uncaught TypeError: Argument 1 passed to hello() must be of the type string, int given.
بدین ترتیب بعد از اضافه کردن اعلان مورد نظر به ابتدای فایل PHP با ارسال عدد صحیح به جای رشته به عنوان آرگومان ارسالی تابع، کد با خطا مواجه خواهد شد.
مقادیر تهیپذیر
در بسیاری از زبانهای برنامه نویسی امکان استفاده از «مقادیر تهیپذیر» (Nullable Values) وجود دارد. در زبان برنامه نویسی PHP نیز این امکان دیده شده است و برای این منظور باید در کنار نوع دادهای پارامتر تابع از کاراکتر ? استفاده کرد. برای درک بهتر این موضوع نمونه کد زیر را در نظر بگیرید.
function welcome(?string $name) {
echo $name;
}
welcome(null); // valid
در قطعه کد بالا متغیر $name از نوع «تهیپذیر» (Nullable) تعیین شده است. با توجه به همین مورد در زمان فراخوانی تابع welcome() امکان ارسال مقدار Null به عنوان آرگومان ارسالی تابع وجود دارد و برنامه بدون خطا اجرا خواهد شد. توجه به مقادیر تهیپذیر در فراخوانی تابع در PHP یکی از مسائل مهم به شمار میرود.
تعیین نوع داده بازگشتی تابع
در نسخه 7 زبان PHP قابلیتی تحت عنوان «تعیین نوع داده بازگشتی» (Return Type Declaration) اضافه شد. بر این اساس، برنامهنویس میتواند نوع داده بازگشتی تابع را همانند نوع داده پارامترهای تابع مشخص کند. برای این منظور باید از علامت : به همراه نوع داده بازگشتی بعد از پرانتزهای تابع استفاده کرد. قطعه کد زیر مثالی از تعیین نوع داده بازگشتی تابع در PHP را نشان میدهد.
<?php
declare(strict_types=1);
function hello(string $name, string $greeting = "Hello", ?string $punctuation = "!"): ?int {
$name = ucwords(strtolower($name));
return $greeting." ".$name.$punctuation;
}
echo hello("SAMMY");
نوع داده بازگشتی برای تابع hello() در مثال بالا میتواند عدد صحیح یا مقدار تهی باشد. با توجه به این که خروجی تابع از نوع رشته است و عدم تطابق نوع دادهای اعلام شده و مقدار بازگشتی خطای زیر در خروجی نشان داده خواهد شد.
Output Warning: Uncaught TypeError: hello(): Return value must be of type ?int, string returned
در متن خطا نیز توضیح داده شده است که مقدار بازگشتی از نوع رشته با نوع داده اعلام شده یعنی عدد صحیح تطابق ندارد. قطعه کد زیر خطای رخ داده در بالا را اصلاح خواهد کرد.
<?php
declare(strict_types=1);
function hello(string $name, string $greeting = "Hello", ?string $punctuation = "!"): string {
$name = ucwords(strtolower($name));
return $greeting." ".$name.$punctuation;
}
echo hello("SAMMY");
با انجام تغییرات فوق خروجی زیر از اجرای نمونه کد بالا حاصل میشود.
Output Hello Sammy!
توابع بدون مقدار بازگشتی
گاهی اوقات توابع برای انجام عملیاتی مورد استفاده قرار میگیرند که منجر به برگشت دادن مقداری نمیشود. مثالهای ارائه شده از تابع در بخشهای ابتدایی این نوشته نمونهای از این دست توابع هستند. در تعیین نوع بازگشتی این توابع باید از نوع داده void استفاده کرد. قطعه کد زیر تابع hello() را نشان میدهد که از نوع داده void برای مقدار بازگشتی تابع استفاده میکند.
<?php
function hello(): void {
echo "Hello World!";
}
$greeting = hello();
استفاده از کلمه کلیدی void نشان میدهد که تابع مقداری را برنمیگرداند. در ادامه، خروجی حاصل از اجرای قطعه کد بالا آورده شده است.
Output Hello World!
منظور از دامنه تابع در PHP چیست؟
«دامنه» (Scope) تنها یک اصطلاح فنی در برنامه نویسی نیست. از این اصطلاح در حوزههای مختلف از جغرافیا گرفته تا سیاست و اقتصاد و هر حوزه دیگری استفاده میشود. به عنوان مثال، دامنه اقیانوس اطلس از قاره آمریکا در غرب به آفریقا و اروپا در شرق و از اقیانوس منجمد شمالی در شمال تا اقیانوس هند در جنوب امتداد دارد. در واقع، دامنه محدوده یک حوزه کاری و موارد مرتبط به آن را تعیین میکند.
منظور از Scope در برنامه نویسی چیست؟
Scope در برنامه نویسی نیز به معنای محدوده کدهای کاربر است و به نحوه دسترسی قطعات مختلف کد به یکدیگر اشاره دارد. Scope در PHP نیز با توجه ساختار کد انواع مختلفی دارد. به طور کلی یک قطعه کد از چندین Scope یا فضای کاری مختلف تشکیل میشود. در ادامه، دو حوزه مهم یعنی «محدوده سراسری» (Global Scope) و «محدوده تابع» (Function Scope) مورد بررسی قرار خواهد گرفت.
محدوده سراسری در PHP چیست؟
به طور پیشفرض، متغیرهای تعریف شده در ابتدای کد یا آن دسته متغیرهایی که درون بدنه تابع قرار ندارند، در محدوده سراسری قرار میگیرند. متغیرهای تعریف شده در محدوده سراسری برای دسترسی به مقادیر مربوط به تابع باید حتما آن را فراخوانی کنند. در واقع، متغیرهای سراسری امکان دسترسی مستقیم به مقادیر تابع را ندارند و تنها باید به مقادیر بازگشتی از تابع اکتفا کنند. به طور پیشفرض توابع ورودی خود را از محدوده سراسری دریافت میکنند و در مقابل نیز خروجی خود را نیز به محدوده سراسری برمیگردانند.
محدوده تابع در PHP چیست؟
محدوده تابع در PHP کدها و متغیرهای تعریف شده در بدنه تابع را در برمیگیرد. برای سایر بخشهای برنامه امکان دسترسی به صورت سراسری به متغیرها و کدهای نوشته شده درون تابع وجود ندارد. البته دسترسی به متغیرهای سراسری درون تابع امکانپذیر است، ولی انجام هر گونه عملیاتی بر روی متغیرهای سراسری در بدنه تابع تغییری در مقدار این متغیرها ایجاد نمیکند.
مثالی از محدوده سراسری و تابع در PHP
در زبان برنامه نویسی PHP دو محدوده سراسری و تابع به عنوان دو موجودیت مجزا در نظر گرفته میشوند.
بر همین اساس، در زمان ارسال یک متغیر سراسری به تابع به جای متغیر مورد نظر تنها مقدار آن متغیر ارسال میشود. در نتیجه، بعد از انجام عملیات توسط تابع هیچ گونه تغییری در متغیر سراسری ارسال شده رخ نمیدهد. قطعه کد زیر به درک بهتر این موضوع کمک میکند.
<?php
declare(strict_types=1);
$name = "SAMMY";
function hello(string $name, string $greeting = "Hello", ?string $punctuation = "!"): string {
$name = ucwords(strtolower($name));
return $greeting." ".$name.$punctuation;
}
echo hello($name);
echo $name;
در نمونه کد بالا متغیر $name با مقدار SAMMY در محدوده سراسری کد تعریف شده است. در ادامه نیز این متغیر به عنوان آرگومان ورودی به تابع hello() ارسال شده است. در زمان تغییر مقدار متغیر $name درون بدنه تابع تنها مقدار متغیر درون بدنه تابع تحت تاثیر قرار میگیرد و متغیر $name در محدوده سراسری هیچ گونه تغییری نمیکند. در ادامه خروجی حاصل از اجرای نمونه کد بالا آورده شده است.
Output Hello Sammy! SAMMY
خروجی حاصل از اجرای دستور echo hello($name) عبارت Hello Sammy است، زیرا متغیر $name به عنوان آرگومان ورودی به تابع ارسال شده و با اعمال تغییرات این مقدار برگشت داده میشود. در ادامه بعد از اجرای دستور echo $name عبارت SAMMY در خروجی چاپ میشود. در نتیجه، متغیر سراسری $name هیچ گونه تغییری نمیکند.
دسترسی به متغیرهای سراسری از طریق تابع در PHP
تفاوت مهم بین محدوده سراسری و محدوده تابع در این است که امکان دسترسی به متغیرهای سراسری از طریق تابع وجود دارد، اما امکان برگشت دادن دادهها از تابع به صورت مستقیم در محدوده سراسری وجود ندارد. در قطعه کد زیر برای دسترسی به متغیرهای سراسری از کلمه کلیدی global استفاده شده است.
<?php
declare(strict_types=1);
$name = "SAMMY";
function hello(string $greeting = "Hello", ?string $punctuation = "!"): string {
global $name;
$name = ucwords(strtolower($name));
return $greeting." ".$name.$punctuation;
}
echo hello();
echo $name;
در نمونه کد بالا متغیر $name در محدوده سراسری تعریف شده است. در این مثال به جای ارسال مقدار به تابع، در اولین خط از بدنه تابع کلمه کلیدی global دسترسی به متغیر سراسری $name را امکانپذیر میکند. کلمه کلیدی global نه تنها مقدار متغیر سراسری بلکه خود آن را دریافت میکند. در نهایت، تغییرات اعمال شده بر روی متغیر در بدنه تابع مقدار آن را خارج از تابع نیز تحت تاثیر قرار میدهد. خروجی حاصل از اجرای نمونه کد بالا به صورت زیر است.
Output Hello Sammy! Sammy
با توجه به خروجی کد مقدار متغیر سراسری $name دچار تغییر شده است. به طور کلی استفاده از متغیرهای سراسری در بدنه تابع توصیه نمیشود، زیرا ردیابی تغییرات و خطایابی کد را در آینده دچار مشکل میکند.
توابع داخلی در PHP
زبان PHP همانند بسیاری از زبانهای برنامه نویسی دیگر توابع داخلی بسیاری را برای انجام عملیاتهای مختلف در دسترس برنامهنویسان قرار داده است. این توابع و دستورالعملهای داخلی و نحوه فراخوانی آنها از قبل درون زبان PHP مشخص شده است.
برای استفاده از توابع داخلی PHP باید مستندات مربوط به نحوه فراخوانی و استفاده از آنها را به طور کامل مطالعه کرد. نحوه تعریف و فراخوانی این توابع در PHP شباهت بسیاری به توابع تعریف شده توسط کاربر دارد. در ادامه، فهرستی از پرکاربردترین توابع داخلی در PHP به همراه عملکرد و نحوه فراخوانی آنها ارائه شده است.
تابع var_dump در PHP
یکی از پرکاربردترین توابع داخلی در PHP توابع مربوط به مدیریت متغیر هستند که جزئیات مربوط به متغیر نظیر نوع یا مقدار آن را اعلام میکنند. تابع var_dump در PHP یکی از معروفترین توابع در این زمینه است که در ادامه مثالی در خصوص کاربرد آن ارائه شده است.
<?php
var_dump("Hello World!");
این تابع در PHP جزئیات مربوط به مقدار داده شده نظیر نوع و اندازه آن را اطلاع میدهد. خروجی حاصل از اجرای نمونه کد بالا در ادامه آورده شده است.
Output string(12) "Hello World!"
در مثال بالا نوع متغیر از نوع رشته و تعداد کاراکترهای آن نیز برابر ۱۲ اعلام شده است. زبان برنامه نویسی PHP توابع داخلی دیگری نیز برای کار با نوعهای دادهای خاص ارائه میدهد.
تابع strlen در PHP
زبان PHP توابع مختلفی را برای کار با رشتهها و انجام عملیات بر روی آنها در دسترس قرار میدهد. تابع strlen در PHP یکی از همین توابع است که اطلاعات مربوط به رشته دریافتی را نشان میدهد. کاربرد این تابع در PHP در قالب قطعه کد زیر نشان داده شده است.
echo strlen("How many characters are contained in this string?");
این تابع یک رشته را به عنوان آرگومان ورودی دریافت میکند و تعداد کاراکترهای موجود در آن را در قالب یک عدد صحیح برمیگرداند. خروجی زیر تعداد کاراکترهای مربوط به رشته دریافتی تابع را نشان میدهد.
Output 49
تابع explode در PHP
توابع دیگری نیز برای کار با رشتهها در PHP وجود دارند که این توابع برای انجام عملیاتی همچون حذف کردن، اضافه کردن و تبدیل کاراکترها در PHP مورد استفاده قرار میگیرند.
تابع explode یکی از توابع داخلی PHP است که برای این منظور کاربرد دارد. این تابع در PHP رشته دریافتی را بر اساس کاراکترهای تقسیم کننده ارائه شده به بخشهای کوچکتر جدا میکند و این بخشها را در قالب آرایه به خروجی برمیگرداند. برای درک بهتر عملکرد تابع explode در PHP مثال زیر را در نظر بگیرید.
<?php
$groceries = explode(",", "Milk, bread, eggs,fish.");
var_dump($groceries);
اولین آرگومان ورودی در مثال بالا , یا کاما است و به عنوان کاراکتر جدا کننده مشخص شده است. در نتیجه، تابع با رسیدن به این عبارت درون رشته یک عنصر جدید را به آرایه اضافه میکند. دومین آرگومان در تابع explode رشته مورد نظر است. در نهایت، خروجی حاصل از نمونه کد بالا به صورت زیر خواهد بود.
Output array(4) { [0]=> string(4) "Milk" [1]=> string(6) " bread" [2]=> string(5) " eggs" [3]=> string(5) "fish." }
مثال بالا نحوه کار تابع explode در جدا کردن عناصر موجود در رشته به کمک کاراکتر جدا کننده کاما را نشان میدهد.
تابع count در PHP
تابع count در PHP تعداد عناصر موجود در «آرایه» (Array) دریافتی را بر میگرداند. نمونه کد زیر مثالی از نحوه کار این تابع را نشان میدهد.
<?php
$groceries = explode(", ", "Milk, bread, eggs,fish.");
var_dump($groceries);
echo count($groceries);
تابع count یک آرایه را به عنوان آرگومان ورودی دریافت میکند و تعداد عناصر موجود در آرایه را در قالب عدد صحیح برگشت میدهد. خروجی حاصل از اجرای نمونه کد بالا در ادامه آورده شده است.
Output array(3) { [0]=> string(4) "Milk" [1]=> string(5) "bread" [2]=> string(10) "eggs,fish." } 3
در مثال بالا تعداد عناصر موجود در آرایه $groceries توسط تابع count برابر عدد ۳ تعیین شده است.
تابع sort در PHP
تابع sort در PHP عناصر موجود در آرایه دریافتی را بر اساس مقادیر آن به صورت صعودی مرتب میکند. مثال زیر نحوه مرتبسازی عناصر آرایه به کمک تابع sort در PHP را نشان میدهد.
<?php
$groceries = array("milk", "bread", "eggs", "fish");
$sorted = sort($groceries);
var_dump($sorted);
var_dump($groceries);
در مثال بالا آرایه $groceries به عنوان پارامتر ورودی به تابع sort داده شده است و خروجی حاصل از اجرای کد نیز به صورت زیر خواهد بود.
Output bool(true) array(4) { [0]=> string(5) "bread" [1]=> string(4) "eggs" [2]=> string(4) "fish" [3]=> string(4) "milk" }
با توجه به خروجی بالا عناصر موجود در آرایه به ترتیب صعودی مرتب شدهاند. در صورت نیاز به مرتبسازی عناصر آرایه به صورت نزولی میتوان از تابع rsort در PHP استفاده کرد.
منظور از language construct در PHP چیست؟
language constructها در زبان PHP شامل یکسری توابع عمومی هستند که بخش مهمی از زبان PHP را تشکیل میدهند. این توابع شباهتهای بسیاری با توابع داخلی در PHP دارند، ولی در عین حال متفاوت از توابع داخلی هستند.
اگر چه language constructها همانند سایر توابع در نظر گرفته میشوند، اما تمام قوانین و «سینتکس» (Syntax) مربوط به توابع را رعایت نمیکنند. به عنوان مثال، کلمه کلیدی echo نمونهای از language constructها در PHP است که برای اجرا نیازی به پرانتز ندارد، در حالی گذاشتن پرانتز یک مورد ضروری برای تعریف و فراخوانی تابع در PHP است.
<?php
echo "Hello World!";
echo("Hello World!");
خروجی حاصل از اجرای دو دستور بالا یکسان و به صورت زیر خواهد بود.
Output Hello World! Hello World!
تابع empty() نیز یک language construct دیگر در زبان PHP است که خالی بودن یا نبودن متغیر داده شده را بررسی میکند. به عنوان مثال، قطعه کد زیر را در نظر بگیرید که از تابع empty() در آن استفاده شده است.
<?php
if (empty($username)) {
echo "Guest";
}
در مثال بالا، اگر empty() یک تابع معمولی بود، اجرای کد با خطا مواجه میشد، زیرا متغیر $username از پیش تعریف نشده است. علاوه بر دو مورد عنوان شده چندین language construct دیگر نیز در زبان PHP وجود دارند که ممکن است با سایر توابع اشتباه گرفته شوند. در ادامه، فهرست تمام language constructهای زبان PHP آورده شده است.
- echo
- Exit
- Die
- Assert
- Return
- include
- include_once
- Eval
- empty
- list
- isset
- require
- require_once
سوالات متداول
بعد از بررسی نحوه تعریف و فراخوانی تابع در PHP و مهمترین نکات در خصوص آن، در این بخش به پرتکرارترین و متداولترین سوالات در حوزه تابع در PHP پاسخ داده شده است.
مهمترین نکته قبل از تعریف تابع در PHP چیست؟
زبان قدرتمند PHP دارای بیش از ۱۰۰۰ تابع داخلی استاندارد است که هر کدام برای انجام عملکردی خاص مورد استفاده قرار میگیرد. در نتیجه، گستردگی توابع در PHP پاسخگو بسیاری از نیازهای برنامهنویس است. بنابراین، ضروری است تا برنامهنویسان قبل از تعریف تابع در PHP لیست توابع داخلی را بررسی کنند و در صورت نبود تابع داخلی نسبت به پیادهسازی تابع جدید اقدام کنند.
توابع در PHP در کدام قسمت از کد تعریف میشوند؟
در زبان برنامه نویسی PHP اهمیتی ندارد که تابع در کدام قسمت کد تعریف شود. امکان تعریف تابع در PHP حتی بعد از فراخوانی تابع نیز وجود دارد. این مورد به این دلیل است که زبان PHP قبل از اجرا تمام کد را میخواند و سپس، برای اجرا به اولین خط بازمیگردد. به طور کلی، توابع در PHP را میتوان در هر مکانی تعریف کرد.
آیا از تابع در PHP برای کار با آرایه نیز استفاده میشود؟
در PHP توابعی مختلفی برای کار با آرایهها وجود دارد که استفاده از آنها موجب کوتاهتر شدن و خوانایی بیشتر کد میشود. توابع مرتبط با آرایهها در PHP برای اعمال مختلفی همچون مرتبسازی آرایه، تولید آرایه، دسترسی به مقادیر آرایه، الحاق آرایهها و انجام عملیات ریاضی بر روی آرایه مورد استفاده قرار میگیرند. پیشتر در مطلب زیر از مجله فرادرس در مورد کار با تابعهای آرایه PHP مواردی عنوان شده است.
آیا توابع در PHP امکان برگشت دادن دو مقدار را دارند؟
خیر، زبان برنامه نویسی PHP از برگرداندن چندین مقدار در تابع پشتیبانی نمیکند.
جمعبندی
توابع در برنامه نویسی قطعه کدهایی هستند که برای انجام عملیاتی خاص مورد استفاده قرار میگیرند. آنها دادهها را به عنوان پارامتر ورودی دریافت میکنند و بعد از انجام عملیات مورد نظر خروجی را بر میگردانند. توابع روشی استاندارد و قدرتمند برای «برنامه نویسی ماژولار» (Modular Programming) ارائه میکنند و قابلیت استفاده مجدد را به کد میدهند. همچنین، توسعهدهندگان با یک مرتبه پیادهسازی توابع میتوانند آنها را در چندین پروژه استفاده کنند.
با توجه به اهمیت استفاده از توابع در PHP در این مطلب از مجله فرادرس نحوه تعریف تابع در PHP و فراخوانی آن مورد بررسی قرار گرفت. علاوه بر این، مزایای استفاده از تابع و انواع آن در PHP نیز عنوان شد. همچنین، در ادامه نیز ضمن بررسی مهمترین توابع داخلی در PHP به بررسی موارد مهمی همچون آرگومان، پارامتر، دامنه تابع، language construct و سایر موارد پرداخته شد.