## call_user_func_array 动态调用方法 >[info] 这个函数在Model模型类源码中得到了大量应用,该函数是PHP 5.2以上版本提供的系统函数,实现了类方法的动态调用。 * * * * * #### 1. 功能:类方法的动态调用 >[info] 注意与另一个函数:call_user_func( )的区别,二者仅仅是参数类型不同,感兴趣同学,可参考PHP用户手册 * 这里我们详细讲解一下更复杂的:call_user_func_array()函数。 * * * * * #### 2. 基本语法: ~~~ call_user_func_array([ '类名','方法名' ], [ 参数数组 ]) ~~~ * 例如: ~~~ call_user_func_array([$class,$method], $param_arr); ~~~ * * * * * #### 3. 实例演示: >[info] 模型操作中,我们经常会静态调用数据库类的连贯方法,而这些方法并不在模型类中定义,那么你有没有想过,这是如何实现的呢? * 下面我们就演示这一过程: >[info] 为了演示方便,我们先做如下约定: 1. 为模拟真实环境,定义三个类:Model类,模型类User,数据库查询类Query; 2. 我们采用静态调用来实现这个过程; 3. 为了简化操作,我们用二维数组模拟数据表中的记录; * 完整代码如下: ~~~ <?php //创建Model类,因该类为抽象类,必须定义子类才可以使用 abstract class Model{ //如果调用的静态方法不存在,则自动触发:__callStatic public static function __callStatic($method,$param_arr){ //这里我们直接设置了$class类名,实际工作中应该用内部方法来实现 $class = 'Query'; //动态调用指定类$class中的指定方法$mothod,参数以数组方式$param_arr传入 return call_user_func_array([$class,$method], $param_arr); } } //创建数据库查询类:Query class Query{ //因为我们模拟的是静态调用,这里select()必须设置与静态方法 public static function select($param_arr){ //直接返回调用数据: return $param_arr; } } //创建自定义模型类:User,假定与数据表User绑定 class User extends Model{ //这里是自定义模型类的代码 } //1. 创建一个自定义结果集,以二维数组呈现,来模拟数据库查询结果 $data = [ ['id' => 1,'name' => 'Peter','age' => 20,'salary' => 4000], ['id' => 2,'name' => 'Jack','age' => 26,'salary' => 5000], ['id' => 3,'name' => 'Tom','age' => 30,'salary' => 6800], ]; //2. 模型类User静态调用select()方法,参数是数据库查询结果集(以二维数据模拟) //注意:User类中并没有定义:静态方法 select(),此时会自动调用父类Model中的__callStatic()方法 //该静态魔术方法会自动将当前调用的select($data)的方法名和参数传给: //call_user_func_array(['Query','select'], $data); $result=User::select($data); //3. 格式化输出查询结果 //设置表头信息 $caption = '<h3 align="center">学生信息表</h3>'; //将传入的表中记录集,以表格方式格式化输出 //设置表头信息 $table = $caption.'<table border="1" cellspacing="0" cellpadding="0" width="300" align="center"><th>id</th><th>姓名</th><th>年龄</th><th>工资</th>'; //根据表中记录数量,循环输出 foreach ($result as $value) { $table = $table. '<tr>'; $table = $table. '<td>'.$value['id'].'</td>'; $table = $table. '<td>'.$value['name'].'</td>'; $table = $table. '<td>'.$value['age'].'</td>'; $table = $table. '<td>'.$value['salary'].'</td>'; $table = $table. '</tr>'; } echo $table; ~~~ * 运行结果如下: 学生信息表 |id |姓名| 年龄| 工资| | --- | --- | --- | --- | |1| Peter| 20| 4000| |2| Jack| 26| 5000| |3| Tom |30| 6800| #### 4. 总结: >[danger] 理解了这个实例,基本上就明白了模型与数据库之间是如何协调工作的啦!