php call_user_func和call_user_func_array

首先要看這個頁面關於callable類型:http://www.php.net/manual/zh/language.types.callable.phpjavascript

自 PHP 5.4 起可用 callable 類型指定回調類型 callback。本文檔基於一樣理由使用 callback 類型信息。php

一些函數如 call_user_func() 或 usort() 能夠接受用戶自定義的回調函數做爲參數。回調函數不止能夠是簡單函數,還能夠是對象的方法,包括靜態類方法。java

傳遞

一個 PHP 的函數以 string 類型傳遞其名稱。能夠使用任何內置或用戶自定義函數,但除了語言結構例如: array(), echo, empty(), eval(), exit(), isset(), list(), print或 unset()數組

一個已實例化的對象的方法被做爲數組傳遞,下標 0 包含該對象,下標 1 包含方法名。函數

靜態類方法也可不經實例化該類的對象而傳遞,只要在下標 0 中包含類名而不是對象。自 PHP 5.2.3 起,也能夠傳遞 'ClassName::methodName'spa

除了普通的用戶自定義函數外, create_function() 能夠用來建立一個匿名回調函數。自 PHP 5.3.0 起也可傳遞 closure 給回調參數。.net

<?php 

// An example callback function
function my_callback_function() {
    echo 'hello world!';
}

// An example callback method
class MyClass {
    static function myCallbackMethod() {
        echo 'Hello World!';
    }
}

// Type 1: Simple callback
call_user_func('my_callback_function'); 

// Type 2: Static class method call
call_user_func(array('MyClass', 'myCallbackMethod')); 

// Type 3: Object method call
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));

// Type 4: Static class method call (As of PHP 5.2.3)
call_user_func('MyClass::myCallbackMethod');

// Type 5: Relative static class method call (As of PHP 5.3.0)
class A {
    public static function who() {
        echo "A\n";
    }
}

class B extends A {
    public static function who() {
        echo "B\n";
    }
}

call_user_func(array('B', 'parent::who')); // A
?>

 使用 Closure 的示例code

<?php
// Our closure
$double = function($a) {
    return $a * 2;
};

// This is our range of numbers
$numbers = range(1, 5);

// Use the closure as a callback here to 
// double the size of each element in our 
// range
$new_numbers = array_map($double, $numbers);

print implode(' ', $new_numbers);
?>

輸出:對象

2 4 6 8 10

參考:http://www.php.net/manual/zh/language.types.callable.phpblog

一篇文章:

call_user_func函數是當須要動態調用函數時,才使用的,這個函數有兩種用法:
第一種是調用孤獨的函數:

<!--?
function funa($b,$c)
{
echo $b;
echo $c;
}
call_user_func('funa', "111","222");
call_user_func('funa', "333","444");
//顯示 111 222 333 444
//你們有沒有發現,這個用法有點像javascript中的call方法,嘿嘿
?-->

第二種是調用類內部的函數

<!--?
class a {
    function b()
    {
    $args = func_get_args();
        $num = func_num_args();
        print_r($args);
        echo $num;
    }
}
call_user_func(array("a", "b"),"111","222");
?-->

上面這個例子,本身運行一下看看結果是什麼吧~嘿嘿~提示一下func_get_args()函數是獲取傳入到函數中的參數,返回一個數組,func_num_args()函數獲取傳入函數中的參數的個數。

下面再來看看
call_user_func_array函數
這個函數也是當須要動態調用函數時用到的,它的用法和call_user_func函數比較像,只是參數傳入的是數組。

<!--?
function a($b, $c)
{
echo $b;
echo $c;
 
}
call_user_func_array('a', array("111", "222"));
//顯示 111 222
?-->
<!--?
Class ClassA
{
 
function bc($b, $c) {
     $bc = $b + $c;
echo $bc;
}
}
call_user_func_array(array('ClassA','bc'), array("111", "222"));
//顯示 333
?-->

一個調用例子:

<!--?
function otest1 ($a)
{
     echo( '一個參數' );
}
 
function otest2 ( $a, $b)
{
    echo( '二個參數' );
}
 
function otest3 ( $a ,$b,$c)
{
    echo( '三個啦' );
}
 
function otest (){
    $args = func_get_args();
    $num = func_num_args();
    call_user_func_array( 'otest'.$num, $args  );
}
otest("11");
otest("11","22");
otest("11","22","33");

 一個很奇怪的問題,我下面有一個文件;

<?php
namespace Foo\Bar\subnamespace;

 
class foo
{
     
    public function printArray(array $arr)
    {
        var_dump($arr);
    }
}

 
$foo1=new foo();
call_user_func_array(array($foo1,'printArray'),array(1,2));

報錯:

Catchable fatal error: Argument 1 passed to Foo\Bar\subnamespace\foo::printArray() must be of the type array, integer given inF:\xampp\htdocs\php\pattern\namespace\file1.php on line 9

我傳遞的的確是數組啊。

爲何printArray說不是數組,換成call_user_func:

call_user_func(array($foo1,'printArray'),array(1,2));

居然正常了。這個沒法解釋。

相關文章
相關標籤/搜索