الدالة call_user_func_array()‎ في PHP

من موسوعة حسوب
< 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()‎‎ إذا وُجد استثناء خلال الاستدعاء السابق لدالة رد النداء.

انظر أيضًا

مصادر