## 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] 理解了这个实例,基本上就明白了模型与数据库之间是如何协调工作的啦!
- 前言[随时更新]
- 开发环境
- 1.Mac环境
- 2.windows环境
- 模型对象
- 1.创建模型对象
- 2.模型初始化
- 数据对象
- 1.定义数据对象
- 2.创建数据对象
- 1.data方法
- 2.setAttr方法
- 3.__set方法
- 4.查询数据对象
- 1.getData方法
- 2.getAttr方法
- 3.__get方法
- OOP难点总结
- 1.get_class( )实例讲解
- 2.get_called_class( )实例讲解
- 3.__call( )实例讲解
- 3.__callStatic( )实例讲解
- 4.call_user_func_array函数[重点]
- 5.普通方法与静态方法
- 6.在Model源码中的应用
- 7.new static 延迟静态绑定
- PHP标准化规范
- 查询数据
- 1.获取单条:get静态方法
- 2.获取单条:对象查询
- 3.获取多条:all静态方法
- 4.获取多条:对象查询
- 5.获取字段值:value方法
- 6.获取列值:column方法
- 7.动态查询:getBy字段名
- 8.助手函数:model查询
- 9.加载器:Loader类查询
- 10.数据库与模型查询对比
- 新增数据
- 1.sava方法
- 2.savaAll方法
- 3.create静态方法
- 4.insert静态调用
- 更新数据
- 1.单条更新:save方法
- 2.批量更新:saveAll方法
- 3.静态更新:update方法
- 4.查询类Query直接更新
- 5. 闭包更新
- 删除数据
- 1.删除当前记录:delete
- 2.静态条件删除:destory
- 获取器
- 1.模型方法:set属性Attr
- 修改器
- 1.set属性Attr
- 时间戳
- 1.MySQL中日期类型复习
- 2.时间戳功能详解
- 软删除[重点]
- 1.traits详解[选学内容]
- 2.SoftDelet类源码分析
- 3. delete实例删除
- 4.destroy条件删除
- 5.restore恢复数据
- 类型转换
- 1. 规则设置
- 2. 实例演示
- 查询范围
- 1. 基本概念
- 2.实例演示