首先,同javascript一样,php也遵守了“一切皆字符串”的原则,造成函数名和字符串某种特别的联系。
//javascript形式的回调
function sayHello($name)
{
echo "Hello ".$name;
}
function greet($name,$callback)
{
$callback($name);
}
greet('zhangsan','sayHello');
//输出结果Hello zhangsan
这是一种简单的方式,如下,使用php内置的回调函数
function testCallBack( $msg1 , $msg2 )
{
echo msg1.' '.$msg2.'
';
}
$fn_Name = "testCallBack";
$params = array( 'zhangsan' , 'san' );
call_user_func_array( $fn_Name , $params );
如果是对类方法的话,回调却是另一种
class CallbackClass
{
public static function fnCallBack( $msg1 , $msg2 )
{
echo 'msg1:'.$msg1;
echo "
\n";
echo 'msg2:'.$msg2;
}
}
$className = 'CallbackClass';
$fnName = "fnCallBack";
$params = array( 'hello' , 'world' );
call_user_func_array( array( $className , $fnName ) , $params );
如果是对象回调呢
class ObjectClass
{
private $name = 'abc';
public function testMethod( $msg1 = 'default msg1' , $msg2 = 'default msg2' )
{
echo 'object name:'.$this->name;
echo "
\n";
echo 'msg1:'.$msg1;
echo "
\n";
echo 'msg2:'.$msg2;
}
}
$myobj = new ObjectClass();
$fnName = "testMethod";
$params = array( 'hello' , 'world' );
$myobj->$fnName();
//当然也可以使用下面的一种
call_user_func_array( array( $myobj , $fnName ) , $params );
目前主流的PHP mvc框架或多或少使用了 方法或函数名可以和字符串转换的功能,此功能非常强大,以至于在mvc中可以自由的通过url进行方法调用。