فراخوانی داینامیک یک تابع در PHP با فانکشن call_user_func_array

فراخوانی داینامیک یک تابع در PHP با فانکشن call_user_func_array

تعریف و فراخوانی تابع در PHP

در زبان PHP قطعه کد هایی که عملیات های محدود و مشخصی را انجام می دهند و ممکن است در چندین جا به کار گرفته شوند را در تابع (function) قرار می دهیم. مثلا تابع زیر را در نظر بگیرید:

function display_full_report() {
	for ($i = 0; $i < $index; $i++) {
		print $i;
	}
}

به صورت معمول زمانی که نیاز داریم کدهای یک تابع اجرا شود، باید آن تابع را با استفاده از اسم آن فراخوانی (Call) کنیم. مثلا وقتی میخواهیم تابع بالا را در قطعه کد PHP دیگری صدا بزنیم، به این صورت عمل می کنیم:

case "full":
  	display_full_report();
  	break;

محدودیت های فراخوانی مستقیم تابع در PHP

این روش مرسومی برای صدا زدن تابع است و ما همیشه از آن استفاده می کنیم. برای صدا زدن تابع باید دقیقا نام تابع را در کد استفاده کنیم و این کار باید در زمان برنامه نویسی انجام شود. وقتی موتور PHP به این تابع می رسد، می داند که باید قطعه کد مربوط به آن را اجرا کند.

ولی همیشه این طور نیست که نام تابعی که باید صدا بزنیم را از قبل و در زمان برنامه نویسی یک قطعه کد بدانیم. در واقع ممکن است نام تابع از منبع دیگر به ما برسد. مثلا توابع مختلفی داریم که بر حسب شرایط یکی از آن ها باید فراخوانی شود. ممکن است یک راه حل این باشد که با استفاده از سوئیچ-کیس (switch-case) در زبان برنامه نویسی PHP حالات مختلف را بررسی کنیم و در زمانی که هر شرط مورد نظر برقرار بود به همان روش معمول تابع مورد نظر را صدا بزنیم مانند مثال زیر:

switch ($condition) {
  	case "summary":
  	display_summary_report();
  	break;
  	case "full":
  	display_full_report();
  	break;
}

این هم برای زمانی است که بتوانیم کد را تغییر بدهیم. ولی در هر صورت نوشتن سوئیچ-کیس های طولانی مطلوب نیست. ممکن است نام تابعی که باید صدا زده شود درون دیتابیس ذخیره شده باشد و یا نام تابع به صورت داینامیک در برنامه تولید شود. به این صورت ما دیگر از قبل نام تابعی که باید صدا زده شود را نمی دانیم مثلا این نام درون یک متغیر به صورت یک رشته در دسترس ما است. بنابراین باید راه دیگری برای فراخوانی تابعی که اسمش را در زمان برنامه نویسی نمی دانیم، پیدا کنیم.

فراخوانی تابع با تابع call_user_func

در پی اچ پی 4 و 5 می توان از تابع call_user_func برای صدا زدن یک تابع به صورت داینامیک استفاده کرد. مثلا وقتی می خواهیم تابع display_full_report را صدا بزنیم به این صورت می نویسیم:

call_user_func("display_full_report");

همانطور که می بینید یک رشته که حاوی نام تابع مورد نظر ماست را به عنوان ورودی به تابع call_user_func داده ایم. کاری که انجام می شود، فراخوانی تابع مورد نظر ما یعنی display_full_report است.

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

تابع دیگری به نام call_user_func_array در زبان PHP وجود دارد که می توانید با استفاده از آن کار مشابهی را انجام بدهیم. ولی پارامتر های ارسالی به تابع داینامیک را باید در یک آرایه در ورودی دوم call_user_func_array با رعایت ترتیب قرار داد.

اگر به صورت گسترده تری به این دو تابع نگاه کنیم، هر دو قابلیت فراخوانی تابع یک object را در برنامه نویسی OO دارند. به این صورت که ورودی اول به جای اینکه فقط حاوی نام تابع باشد، بایستی یک آرایه که حاوی آبجکت مورد نظر و نام تابع عضو کلاس که روی آن صدا زده شود، باشد.

نمونه از کاربرد تابع call_user_func_array

یک نمونه بسیار ساده از مطالبی که بیان شد را در مثال زیر می بینیم:

$report_type = $_GET["report_type"];
$func_name = get_func_name_for_reporting($report_type);
call_user_func_array($func_name, $_GET);

function get_func_name_for_reporting($report_type) {
  return "display_{$report_type}_report";
}

function display_full_report($parameters) {
  print "full report";
}

function display_summary_report($parameters) {
  print "sumamry report";
}

در آدرس صفحه یک پارامتر به نام report_type در نظر گرفته ایم. که در آدرس مشخص می کند که گزارش تولید شده باید خلاصه (Summary) یا کامل (full) باشد. این پارامتر را به تابع دیگری داده این که (get_func_name_for_reporting) نام تابع مورد نیاز برای تولید گزارش را باز می گرداند. سپس نام تابعی که باید صدا زده شود در متغیر $func_name نگه داری می شود. طبق آموزش های مطرح شده در این مقاله برای صدا زدن تابعی که اسم آن را در زمان اجرا می دانیم باید از یکی از توابع call_user_func و call_user_func_array استفاده کنیم. با توجه به اینکه در اینجا ما میخواهیم به صورت کامل همه پارامتر های ارسالی کاربر در query string را به تابع تولید گزارش بدهیم از تابع call_user_func_array استفاده می کنیم چون پارامتر ورودی تابع تولید گزارش یک آرایه است.

نظرات

عالی بود.

بسیار ساده و روتن توضیح داده بودید ، خیلی مفید بود . متشکرم

دمت گرم خیلی عالی بود

ارسال نظر