## 魔術方法 :__call( )實例詳解
#### 1. 功能:當調用的方法不存在或權限不足時自動觸發該方法。
>[info] 框架中每個類幾乎都有這個魔術方法,很實用也很簡單,直接上實例講解。
#### 2. 實例:
>[warning] 幾乎每一步都有注釋,如果感到陌生,請參閱《PHP官方手冊》。
~~~
<?php
//創建父類:Member
class Member{
//創建受保護屬性:數組
protected $memberdata = array();
//當調用的方法不存在或權限不足時,會自動調用__call方法
public static function __call($func, $arguments){
//explode():用'_'字符串分割為數組
//list():將數組元素轉為對應的獨立變量:$type,$name
list($type, $name) = explode('_', $func);
//如何$type字符串不在數組'set'和'get'中任何一個
//或者$name為空的話,則調用的方法名稱不正確,直接返回'空';
if(!in_array($type, array('set','get')) || $name==''){
return '';
}
//獲取調用當前方法的類名
//即:當前方法靜態綁定的類名: 如 User
$feature = get_called_class();
//判斷$type值
switch($type){
//如果$type = 'set',則是給屬性$memeberdata賦值
case 'set':
//將當前方法的參數數組的值$arguments[0]
//賦給屬性 $memberdata[$feature][$name]:注意是二維數組
//當前方法只有一個值:$arguments[0]
self::$memberdata[$feature][$name] = $arguments[0];
break;
//如果$type = 'get',則是獲取屬性$memeberdata的值
case 'get':
//如果 self::$memberdata[$feature][$name]存在則返回該值,否則返回:空
return isset(self::$memberdata[$feature][$name])? self::$memberdata[$feature][$name] : '';
break;
default:
}
}
}
//創建子類:User,繼承自:Member類
class User extends Member{
//定義公共方法:show(),用來輸出數據
public function show(){
//獲取調用當前方法的類名,如:User
$feature = get_called_class();
//如果self::$memberdata[$feature]屬性存在
if(self::$memberdata[$feature]){
//輸出與當前類所對應的$memberdata[$feature]屬性值
foreach(self::$memberdata[$feature] as $key=>$member){
echo $key.':'.$member.'<br>';
}
}
}
}
//創建子類:Profession,繼承自:Member類
class Profession extends Member{
//定義公共方法:show(),用來輸出數據
public function show(){
//獲取調用當前方法的類名,如:Profession
$feature = get_called_class();
//如果self::$memberdata[$feature]屬性存在
if(self::$memberdata[$feature]){
//輸出與當前類所對應的$memberdata[$feature]屬性值
foreach(self::$memberdata[$feature] as $key=>$member){
echo $key.':'.$member.'<br>';
}
}
}
}
//調用set_name(),set_age()
//當前類User和父類中都沒有set_name方法,于是自動觸發父類__call()方法
//父類Member中的__call($func,$arguments)是系統魔術方法
//在__call方法中,方法名set_name轉換為變量$type和$name
//并根據$type,完成屬性的動態賦值或讀取操作
//set_name(),set_age()分別完成了對$memberdata[$feature]屬性的動態賦值操作
$user = new User();
$user -> set_name('ThinkPHP');
$user -> set_age(10);
$user -> show();
//調用set_profession(),set_price()
//當前類User和父類中都沒有set_name靜態方法,于是自動觸發父類__callStatic()方法
//父類Member中的__callStatic($func,$arguments)是系統魔術方法
//在__callStatic方法中,方法名set_name轉換為變量$type和$name
//并根據$type,完成屬性的動態賦值或讀取操作
//set_name(),set_age()分別完成了對$memberdata[$feature]屬性的動態賦值操作
$profession = new Profession();
$profession -> set_lession('模型');
$profession -> set_teacher('理達課堂');
$profession -> show();
~~~
* 運行結果:
~~~
name:ThinkPHP
age:10
lession:模型
teacher:理達課堂
~~~
#### 4. 總結:
>[success] 當調用不存在的方法,或者越權調用某個方法,__call( )方法提供了一種容錯機制,可以讓我們更加靈活的使用面向對象編程,帶來的好處。
- 前言[隨時更新]
- 開發環境
- 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.實例演示