首先要看這個頁面關於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));
居然正常了。這個沒法解釋。