本文實例講述了PHP __call()方法實現(xiàn)委托。分享給大家供大家參考,具體如下:
委托是指一個對象轉(zhuǎn)發(fā)或者委托一個請求給另一個對象,被委托的一方替原先對象處理請求。這類似于繼承,和在子類中調(diào)用父類的方法有點兒相似。
但在繼承時,父類與子類的關(guān)系是固定的,而使用委托則可以在代碼運行時改變使用的對象,這意味著委托比繼承具有更大的靈活性。
1、創(chuàng)建一個類來將Person類的信息格式化并輸出:
class PersonWriter{
public function writeName(Persion $p){
print $p->getName()."\n";
}
public function writeAge(Persion $p){
print $p->getAge()."\n";
}
}
2、下面的代碼集合使用__call()方法和PersonWriter類對象來實現(xiàn)Person類:
class Person {
private $writer;
function __construct(PersonWriter $writer;){
$this->writer = $writer;
}
function __call($methodname,$args){
if(method_exists($this->writer,$methodname)){
return $this->writer->$methodname($this);
}
}
//...
}
代碼中Person類接收一個PersonWriter對象作為構(gòu)造方法的參數(shù),并將它保持在屬性變量writer。
在__call()
方法中,使用參數(shù)$methodname,檢查PersonWriter對象中是否存在同名方法。如果相應(yīng)方法存在,我們就委托PersonWriter對象來處理(調(diào)用相應(yīng)方法),把當前類(Person類)的實例作為參數(shù)傳遞給PersonWriter對象(使用$this偽變量)。
因此,如果這樣調(diào)用Person類:
$person = new Person(new PersonWriter());
$person->writeName();
__call()
方法會被調(diào)用。然后會在PersonWriter對象中查找writeName()
方法,并調(diào)用之。
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《PHP數(shù)據(jù)結(jié)構(gòu)與算法教程》、《php程序設(shè)計算法總結(jié)》、《php字符串(string)用法總結(jié)》、《PHP數(shù)組(Array)操作技巧大全》、《PHP常用遍歷算法與技巧總結(jié)》及《PHP數(shù)學運算技巧總結(jié)》
希望本文所述對大家PHP程序設(shè)計有所幫助。
您可能感興趣的文章:- php面向?qū)ο蟮姆椒ㄖ剌d兩種版本比較
- php繼承中方法重載(覆蓋)的應(yīng)用場合
- PHP使用方法重載實現(xiàn)動態(tài)創(chuàng)建屬性的get和set方法
- PHP利用func_get_args和func_num_args函數(shù)實現(xiàn)函數(shù)重載實例
- php中拷貝構(gòu)造函數(shù)、賦值運算符重載
- PHP小技巧之函數(shù)重載
- PHP實現(xiàn)重載的常用方法實例詳解
- PHP面相對象中的重載與重寫
- PHP面向?qū)ο蟪绦蛟O(shè)計重載(overloading)操作詳解
- PHP面向?qū)ο蟪绦蛟O(shè)計模擬一般面向?qū)ο笳Z言中的方法重載(overload)示例
- php魔術(shù)函數(shù)__call()用法實例分析
- php 使用 __call實現(xiàn)重載功能示例