توابع تعریف شده توسط کاربر
یک تابع را می توان با استفاده از ساختار دستوری زیر ایجاد نمود:
مثال اول: شبه کد لازم برای نمایش کاربردهای تابع
<?php function foo($arg_1, $arg_2, /* ..., */ $arg_n) { echo "Example function.\n"; return $retval; } ?>
هر نوع کد معتبر پی اچ پی را می توان در داخل تابع استفاده کرد، حتی سایر توابع و تعریف های کلاس. نام های توابع از قوانین مشابه نامگذاری برچسب ها در پی اچ پی تبعیت می کنند. یک نام معتبر تابع با یک حرف و یک زیرخط آغاز می شود، که پس از آن می تواند هر تعداد عدد و حرف یا علامت زیرخط استفاده کرد. این قوانین را در قالب یک عبارت رایج (Regular expression) می توان به این شکل بیان کرد:
[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*
نیازی نیست توابع را قبل از اینکه به آنها ارجاع دهید تعریف کرده باشید، به استثنای زمانی که یک تابع به صورت مشروط تعریف می شود، مانند دو مثال زیر.
زمانی که یک تابع به شیوه شرطی تعریف می شود، مانند دو مثال زیر، تعریف آن باید قبل از فراخوانی تابع انجام شده باشد.
مثال دوم: توابع شرطی
<?php $makefoo = true; /* We can't call foo() from here since it doesn't exist yet, but we can call bar() */ bar(); if ($makefoo) { function foo() { echo "I don't exist until program execution reaches me.\n"; } } /* Now we can safely call foo() since $makefoo evaluated to true */ if ($makefoo) foo(); function bar() { echo "I exist immediately upon program start.\n"; } ?>
مثال سوم: توابع در داخل توابع
<?php function foo() { function bar() { echo "I don't exist until foo() is called.\n"; } } /* We can't call bar() yet since it doesn't exist. */ foo(); /* Now we can call bar(), foo()'s processing has made it accessible. */ bar(); ?>
تمامی توابع و کلاس ها در پی اچ پی داره حوزه سراسری هستند (global scope) – آنها را می توان در خارج از یک تابع فراخوانی کرد حتی اگر در داخل تابع تعریف شده باشند و بالعکس.
پی اچ پی از سربار (overload) توابع پشتیبانی نمی کند، همچنین امکان تعریف دوباره یا از تعریف خارج کردن توابعی که قبلا معرفی شده اند وجود ندارد.
نکته: نام توابع به بزرگی و کوچکی حروف حساس نیستند، البته معمولا بهتر است که توابع را همانگونه که در تعریفشان مشخص شده اند فراخوانی کنید.
در پی اچ پی می توان توابع برگشتی را نیز فراخوانی کرد. با این وجود از استفاده از فراخوانی توابع یا متدهایی که بیش از 100 الی 200 مرحله بازگشتی دارند خودداری نمایید به خاطر اینکه ممکن است این مساله باعث شود پشته آسیب ببیند و اجرای اسکریپت فعلی متوقف شود.
مثال چهارم: توابع بازگشتی
<?php function recursion($a) { if ($a < 20) { echo "$a\n"; recursion($a + 1); } } ?>