溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

yii2行為的方法怎樣注入到組件類(lèi)中

發(fā)布時(shí)間:2021-02-08 09:56:18 來(lái)源:億速云 閱讀:177 作者:小新 欄目:開(kāi)發(fā)技術(shù)

小編給大家分享一下yii2行為的方法怎樣注入到組件類(lèi)中,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

前言

當(dāng)了解了行為屬性的注入邏輯后,方法的注入對(duì)于我們來(lái)說(shuō)就很簡(jiǎn)單了。邏輯一樣。只不過(guò)此刻我們不再調(diào)用 __get 方法,而是一個(gè)用于方法的 __call 方法。下面話(huà)不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹:

在研究之前先跟我學(xué)習(xí)兩個(gè)PHP的知識(shí):

  • __call

  • call_user_func_array

__call

__call 是 PHP 的一個(gè)魔術(shù)方法,這個(gè)方法和 __get 功能差不多,當(dāng)發(fā)現(xiàn)一個(gè)類(lèi)的方法未定義時(shí)會(huì)觸發(fā)此函數(shù),它有兩個(gè)參數(shù)

public mixed __call ( string $name , array $arguments )

$name 參數(shù)是要調(diào)用的方法名稱(chēng)。$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è)官方文檔地址 傳送門(mén)

call_user_func_array

調(diào)用回調(diào)函數(shù),并把一個(gè)數(shù)組參數(shù)作為回調(diào)函數(shù)的參數(shù)。先貼個(gè)官方文檔地址 傳送門(mén) ,舉個(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ù)后,我們開(kāi)始研究行為方法的注入。

方法如何注入

說(shuō)來(lái)蠻簡(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ì)象此方法是否存在。

  • 如果存在則通過(guò) call_user_func_array 調(diào)用此行為的方法

最后達(dá)到和組件調(diào)用自己的方法一樣的效果。

以上是“yii2行為的方法怎樣注入到組件類(lèi)中”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI