## 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.實例演示