欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Object和Component的區(qū)別是什么

這篇文章給大家介紹Object和Component的區(qū)別是什么,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

我們提供的服務有:做網(wǎng)站、網(wǎng)站設計、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、蕪湖縣ssl等。為上1000+企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的蕪湖縣網(wǎng)站制作公司

由于Componet引入了事件、行為,因此,它并非簡單繼承了Object的屬性實現(xiàn)方式,而是基于同樣的機制, 重載了 __get() __set() 等函數(shù)。但從實現(xiàn)機制上來講,是一樣的。這個不影響理解。

前面說過,官方將Yii定位于一個基于組件的框架??梢娊M件這一概念是Yii的基礎。 如果你有興趣閱讀Yii的源代碼或是API文檔,你將會發(fā)現(xiàn), Yii幾乎所有的核心類都派生于(繼承自) yii\base\Component 。

在Yii1.1時,就已經(jīng)有了component了,那時是 CComponent。Yii2將Yii1.1中的CComponent拆分成兩個類: yii\base\Object 和 yii\base\Component 。

其中,Object比較輕量級些,通過getter和setter定義了類的屬性(property)。 Component派生自Object,并支持事件(event)和行為(behavior)。因此,Component類具有三個重要的特性:屬性(property)、事件(event)、行為(behavior)。

相信你或多或少了解過,這三個特性是豐富和拓展類功能、改變類行為的重要切入點。 因此,Component在Yii中的地位極高。

在提供更多功能、更多便利的同時,Component由于增加了event和behavior這兩個特性, 在方便開發(fā)的同時,也犧牲了一定的效率。 如果開發(fā)中不需要使用event和behavior這兩個特性,比如表示一些數(shù)據(jù)的類。 那么,可以不從Component繼承,而從Object繼承。 典型的應用場景就是如果表示用戶輸入的一組數(shù)據(jù),那么,使用Object。 而如果需要對對象的行為和能響應處理的事件進行處理,毫無疑問應當采用Component。 從效率來講,Object更接近原生的PHP類,因此,在可能的情況下,應當優(yōu)先使用Object。

Object的配置方法

Yii提供了一個統(tǒng)一的配置對象的方式。這一方式貫穿整個Yii。Application對象的配置就是這種配置方式的體現(xiàn):

$config = yii\helpers\ArrayHelper::merge(

require(__DIR__ . '/../../common/config/main.php'),

require(__DIR__ . '/../../common/config/main-local.php'),

require(__DIR__ . '/../config/main.php'),

require(__DIR__ . '/../config/main-local.php')

);

$application = new yii\web\Application($config);

$config 看著復雜,但本質(zhì)上就是一個各種配置項的數(shù)組。Yii中就是統(tǒng)一使用數(shù)組的方式對對象進行配置,而實現(xiàn)這一切的關鍵就在 yii\base\Object 定義的構造函數(shù)中:

public function __construct($config = [])

{

if (!empty($config)) {

Yii::configure($this, $config);

}

$this->init();

}

所有 yii\base\Object 的構建流程是:

構建函數(shù)以 $config 數(shù)組為參數(shù)被自動調(diào)用。

構建函數(shù)調(diào)用 Yii::configure() 對對象進行配置。

在最后,構造函數(shù)調(diào)用對象的 init() 方法進行初始化。

數(shù)組配置對象的秘密在 Yii::configure() 中,但說破了其實也沒有什么神奇的:

public static function configure($object, $properties)

{

foreach ($properties as $name => $value) {

$object->$name = $value;

}

return $object;

}

配置的過程就是遍歷 $config 配置數(shù)組,將數(shù)組的鍵作為屬性名,以對應的數(shù)組元素的值對對象的屬性賦值。因此,實現(xiàn)Yii這一統(tǒng)一的配置方式的要點有:

繼承自 yii\base\Object 。

為對象屬性提供setter方法,以正確處理配置過程。

如果需要重載構造函數(shù),請將 $config 作為該構造函數(shù)的最后一個參數(shù),并將該參數(shù)傳遞給父構造函數(shù)。

重載的構造函數(shù)的最后,一定記得調(diào)用父構造函數(shù)。

如果重載了 yii\base\Object::init() 函數(shù),注意一定要在重載函數(shù)的開頭調(diào)用父類的 init() 。

只要實現(xiàn)了以上要點,就可以使得你編寫的類可以按照Yii約定俗成的方式進行配置。這在編寫代碼的過程中,帶來許多便利。

像你這么聰明的,肯定會提出來,如果配置數(shù)組的某個配置項,也是一個數(shù)組,這怎么辦? 如果某個對象的屬性,也是一個對象,而非一個簡單的數(shù)值或字符串時,又怎么辦?

這兩個問題,其實是同質(zhì)的。如果一個對象的屬性,是另一個對象,就像Application里會引入諸多的Component一樣, 這是很常見的。如后面會看到的 $app->request 中的 request 屬性就是一個對象。 那么,在配置 $app 時,必然要配置到這個 reqeust 對象。 既然 request 也是一個對象,那么他的配置要是按照Yii的規(guī)矩來,也就是用一個數(shù)組來配置它。 因此,上面提到的這兩個問題,其實是同質(zhì)的。

那么,怎么實現(xiàn)呢?秘密在于setter函數(shù)。由于 $app 在進行配置時,最終會調(diào)用 Yii::configure() 函數(shù)。 該函數(shù)又不區(qū)分配置項是簡單的數(shù)值還是數(shù)組,就直接使用 $object->$name = $value 完成屬性的賦值。 那么,對于對象屬性,其配置值 $value 是一個數(shù)組,為了使其正確配置。 你需要在其setter函數(shù)上做出正確的處理方式。 Yii應用 yii\web\Application 就是依靠定義專門的setter函數(shù),實現(xiàn)自動處理配置項的。 比如,我們在Yii的配置文件中,可以看到一個配置項 components ,一般情況下,他的內(nèi)容是這樣的:

'components' => [

'request' => [

// !!! insert a secret key in the following (if it is empty) -

// this is required by cookie validation

'cookieValidationKey' => 'v7mBbyetv4ls7t8UIqQ2IBO60jY_wf_U',

],

'user' => [

'identityClass' => 'common\models\User',

'enableAutoLogin' => true,

],

'log' => [

'traceLevel' => YII_DEBUG ? 3 : 0,

'targets' => [

[

'class' => 'yii\log\FileTarget',

'levels' => ['error', 'warning'],

],

],

],

'errorHandler' => [

'errorAction' => 'site/error',

],

],

這是一個典型嵌套配置數(shù)組。那么Yii是如何把他們配置好的呢? 聰明的你肯定想到了,Yii一定是定義了一個名為 setComponents 的setter函數(shù)。 當然,Yii并未將該函數(shù)放在 yii\web\Application 里,而是放在父類 yii\di\ServiceLocator 里面。 至于 ServiceLocator 是何方神圣,在后面 服務定位器(Service Locator) 部分會講到, 這里你只需要知道它是Application的父類,提供components屬性的setter方法就可以了:

public function setComponents($components)

{

foreach ($components as $id => $component) {

$this->set($id, $component);

}

}

這里有個成員函數(shù), $this->set() ,他是服務定位器用來注冊服務的方法。 我們暫時不講這個東西,留待 服務定位器(Service Locator) 部分再講。 現(xiàn)在只要知道這個函數(shù)把配置文件中的 components 配置項搞定就可以了。

從 yii\base\Object::__construct() 來看,對于所有Object,包括Component的屬性,都經(jīng)歷這么4個階段:

預初始化階段。這是最開始的階段,就是在構造函數(shù) __construct() 的開頭可以設置property的默認值。

對象配置階段。也就是前面提到構造函數(shù)調(diào)用 Yii::configure($this, $config) 階段。 這一階段可以覆蓋前一階段設置的property的默認值,并補充沒有默認值的參數(shù),也就是必備參數(shù)。 $config 通常由外部代碼傳入或者通過配置文件傳入。

后初始化階段。也就是構造函數(shù)調(diào)用 init() 成員函數(shù)。 通過在 init() 寫入代碼,可以對配置階段設置的值進行檢查,并規(guī)范類的property。

類方法調(diào)用階段。前面三個階段是不可分的,由類的構造函數(shù)一口氣調(diào)用的。 也就是說一個類一但實例化,那么就至少經(jīng)歷了前三個階段。 此時,該對象的狀態(tài)是確定且可靠的,不存在不確定的property。 所有的屬性要么是默認值,要么是傳入的配置值,如果傳入的配置有誤或者沖突,那么也經(jīng)過了檢查和規(guī)范。 也就是說,你就放心用吧。

關于Object和Component的區(qū)別是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

新聞名稱:Object和Component的區(qū)別是什么
路徑分享:http://aaarwkj.com/article14/igcode.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供關鍵詞優(yōu)化靜態(tài)網(wǎng)站、網(wǎng)站導航App開發(fā)、建站公司、標簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化
国产日韩亚洲欧美精品专区| 97精品久久九九中文字幕| 午夜少妇福利在线观看| 亚洲综合激情另类专区| 一区二区尤物区亚洲国产精品区| 色悠悠色综合视频在线| 国产亚洲一区二区三区av| 国产一区二区精品不卡| 熟妇人妻精品一区二区| 久久超碰一区二区三区| 亚洲乱色熟女一区二区三区麻豆| 手机不卡高清播放一区二区| 久久91亚洲精品中文字幕| 中文有码人妻字幕在线| 日韩传媒在线观看视频| 国产偷人伦激情在线观看| 日本一区二区三区久久久| 亚洲香蕉视频免费在线观看| 亚洲欧美一区二区中文字幕| 国产视频不卡一区二区| 亚洲精品一区二区激情| 久久国产精品av在线观看| 亚洲欧美成人自偷自拍一区| 熟妇高潮一区二区三区| 日本精品国产一区二区在线| 日本高清一区二区高清| 极品少妇一级人妻av| 黄色三级亚洲男人的天堂| 黄色大片免费在线观看| 少妇一夜一次一区二区| 国产视频传媒一区二区| 亚洲国产熟女一区二区三| 日韩欧美乱码一区二区| 日韩欧美在线观看一区二区| 久久久精品国产亚洲av色哟哟| av熟女一区二区三区| 人妻中出中文字幕一区二区| 免费女性啪啪无遮挡网站| 极品人妻视频中文字幕| 亚洲超清av在线播放一区二区| 亚洲精品一区二区三区三州|