الدالة call_user_func_array()
في PHP
(PHP 4 >= 4.0.4, PHP 5, PHP 7)
تستدعي الدالة call_user_func_array()
دالة رد نداء (callback function) مع تمرير مصفوفة من المعاملات إليها.
الوصف
mixed call_user_func_array ( callable $callback , array $param_arr )
تستدعي الدالة call_user_func_array()
دالة رد النداء المُمرَّرة إليها من خلال المعامل الأول callback
مع المعاملات الموجودة في المصفوفة param_arr
.
المعاملات
callback
دالة رد النداء (callback function) التي نريد استدعاءها.
param_arr
المُعاملات التي ستمرَّر إلى دالة رد النداء callback كمصفوفة مفهرسة.
القيم المعادة
تُعاد القيمة التي ستُعيدها داة رد النداء callback
، أو القيمة FALSE
في حال حدوث خطأ.
سجل التغييرات
الإصدار | الوصف |
---|---|
5.3.0 | تم تغيير تفسير الكلمات المفتاحية كائنية التوجه مثل parent و self . إذ كان استدعائها سابقًا من خلال السياق النحوي باستخدام النقطتين المزدوجتين الرأسيتين : سيؤدي إلى ظهور التحذير E_STRICT لأنّها كانت تُفسَّر على أنها ساكنة (static).
|
أمثلة
المثال 1: مثال عن استخدام الدالة call_user_func_array()
<?php
function foobar($arg, $arg2) {
echo __FUNCTION__, " got $arg and $arg2\n";
}
class foo {
function bar($arg, $arg2) {
echo __METHOD__, " got $arg and $arg2\n";
}
}
//مع معاملين foobar استدعاء الدالة
call_user_func_array("foobar", array("one", "two"));
//مع وسيطين foo في الكائن bar استدعاء التابع
$foo = new foo;
call_user_func_array(array($foo, "bar"), array("three", "four"));
?>
سينتج المثال السابق الناتج الآتي:
foobar got one and two
foo::bar got three and four
المثال 2: استخدام مجالات الأسماء مع الدالة call_user_func_array()
<?php
namespace Foobar;
class Foo {
static public function test($name) {
print "Hello {$name}!\n";
}
}
// بدءًا من الإصدار 5.3.0
call_user_func_array(__NAMESPACE__ .'\Foo::test', array('Hannes'));
// بدءًا من الإصدار 5.3.0
call_user_func_array(array(__NAMESPACE__ .'\Foo', 'test'), array('Philip'));
?>
سينتج المثال السابق الناتج الآتي:
Hello Hannes!
Hello Philip!
المثال 3: استخدام دالة مجهولة
<?php
$func = function($arg1, $arg2) {
return $arg1 * $arg2;
};
var_dump(call_user_func_array($func, array(2, 4))); /* بدءًا من الإصدار 5.3.0 */
?>
سينتج المثال في الأعلى الناتج الآتي:
int(8)
المثال 4: تمرير القيم بالمرجعية
<?php
function mega(&$a){
$a = 55;
echo "function mega \$a=$a\n";
}
$bar = 77;
call_user_func_array('mega',array(&$bar));
echo "global \$bar=$bar\n";
?>
سينتج المثال في الأعلى:
function mega $a=55
global $bar=55
ملاحظات
قبل PHP 5.4, كانت المتغيرات المرجعيّة في param_arr
تمرّر إلى الدالة بالمرجعية، بغض النظر عما إذا كانت الدالة تتوقع تمرير المحدّد الخاص عن طريق المرجعية. إذ لا ينتج تنبيهات عن إهمال هذه الخاصية عند إجراء تمرير بالمرجعية في وقت الاستدعاء (call-time)، لاحظ أنَّ هذه الخاصية قد حُذِفَت في إصدار PHP 5.4. علاوةً على ذلك، لم يطبق ذلك على الدوال الداخلية (internal functions) التي احترمَت بنية الدالة وتوقيعها (signature، أي سطر التعريف الخاص بالدالة).. تمرير المعاملات بالقيمة عندما تتوقع الدّالة تمرير المعاملات بالمرجعية يؤدي إلى إطلاق تحذير ويجعل الدالة call_user_func()
تعيد القيمة FALSE
.
لن تُستدعى دوال رد النداء المسجّلة مع دوال مثل call_user_func()
و call_user_func_array()
إذا وُجد استثناء خلال الاستدعاء السابق لدالة رد النداء.
انظر أيضًا
- الدالة
call_user_func()
: استدعاء دالة رد النداء الممرّرة في المعامل الأول. - معلومات حول النوع callback.
- الدالة
ReflectionFunction::invokeArgs()
: طلب معاملات الدالة. - الدالة
ReflectionMethod::invokeArgs()
: طلب معاملات دالة في صنف.