PHP函数的回调方式和字符串转为函数

首先,同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.'<br/>';
}
$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 "<br />\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 "<br />\n";
        echo 'msg1:'.$msg1;
        echo "<br />\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进行方法调用。



你可能感兴趣的:(PHP函数的回调方式和字符串转为函数)