yii2行為的方法如何注入到組件類中詳解
前言
當(dāng)了解了行為屬性的注入邏輯后,方法的注入對(duì)于我們來說就很簡(jiǎn)單了。邏輯一樣。只不過此刻我們不再調(diào)用 __get 方法,而是一個(gè)用于方法的 __call 方法。下面話不多說了,來一起看看詳細(xì)的介紹:
在研究之前先跟我學(xué)習(xí)兩個(gè)PHP的知識(shí):
- __call
- call_user_func_array
__call
__call 是 PHP 的一個(gè)魔術(shù)方法,這個(gè)方法和 __get 功能差不多,當(dāng)發(fā)現(xiàn)一個(gè)類的方法未定義時(shí)會(huì)觸發(fā)此函數(shù),它有兩個(gè)參數(shù)
public mixed __call ( string $name , array $arguments )
$name 參數(shù)是要調(diào)用的方法名稱。$arguments 參數(shù)是一個(gè)枚舉數(shù)組,包含著要傳遞給方法 $name 的參數(shù),舉個(gè)例子
class User { public function __call($name, $arguments) { echo "Calling object method '$name' " . implode(', ', $arguments). "\n"; } } // do it $model = new User(); $model->hello("abei2017");// Calling object method 'hello' abei2017
看懂了么,貼個(gè)官方文檔地址 傳送門
call_user_func_array
調(diào)用回調(diào)函數(shù),并把一個(gè)數(shù)組參數(shù)作為回調(diào)函數(shù)的參數(shù)。先貼個(gè)官方文檔地址 傳送門 ,舉個(gè)例子再。
class User { function Hello($arg) { echo __METHOD__, " got $arg\n"; } } $model = new User(); call_user_func_array([$model, "Hello"], ["abei2017"]); // User::Hello got abei2017
OK,在你了解了這兩個(gè)函數(shù)后,我們開始研究行為方法的注入。
方法如何注入
說來蠻簡(jiǎn)單,就一個(gè)方法
// vendor/yiisoft/yii2/base/Component.php public function __call($name, $params){ $this->ensureBehaviors(); foreach ($this->_behaviors as $object) { if ($object->hasMethod($name)) { return call_user_func_array([$object, $name], $params); } } throw new UnknownMethodException('Calling unknown method: ' . get_class($this) . "::$name()"); }
邏輯很簡(jiǎn)單
- 使用
$this->ensureBehaviors();
函數(shù)確保所有行為到位。 - 遍歷組件當(dāng)前的行為,并判斷行為對(duì)象此方法是否存在。
- 如果存在則通過
call_user_func_array
調(diào)用此行為的方法
最后達(dá)到和組件調(diào)用自己的方法一樣的效果。
總結(jié)
到現(xiàn)在我們知道如何配置行為、行為運(yùn)行、行為注入原理,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
利用phpexcel把excel導(dǎo)入數(shù)據(jù)庫和數(shù)據(jù)庫導(dǎo)出excel實(shí)現(xiàn)
本文介紹利用phpexcel對(duì)數(shù)據(jù)庫數(shù)據(jù)導(dǎo)入excel(excel篩選)、導(dǎo)出excel,大家參考使用吧2014-01-01基于PHP+jQuery+MySql實(shí)現(xiàn)紅藍(lán)(頂踩)投票代碼
當(dāng)雙方意見不統(tǒng)一的情況下,需要用投票達(dá)成協(xié)議,本文通過實(shí)例給大家介紹基于PHP+jQuery+MySql實(shí)現(xiàn)紅藍(lán)(頂踩)投票代碼,需要的朋友可以參考下2015-08-08Laravel 中使用簡(jiǎn)單的方法跟蹤用戶是否在線(推薦)
最近小編在做一個(gè)需求,需要在Laravel應(yīng)用程序用戶個(gè)人資料頁面上,用戶名旁邊添加一個(gè)綠點(diǎn),表示他們是否在線。下面小編給大家?guī)硪环N簡(jiǎn)單方法實(shí)現(xiàn)Laravel 跟蹤用戶是否在線,感興趣的朋友一起看看吧2019-10-10基于Laravel-admin 后臺(tái)的自定義頁面用法詳解
今天小編就為大家分享一篇基于Laravel-admin 后臺(tái)的自定義頁面用法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-09-09php array_values 返回?cái)?shù)組的所有值詳解及實(shí)例
這篇文章主要介紹了php array_values 返回?cái)?shù)組的所有值詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2016-11-11