首頁  >  文章  >  後端開發  >  Yii源碼解讀-屬性

Yii源碼解讀-屬性

WBOY
WBOY原創
2016-07-29 08:58:151138瀏覽

Yii基礎

屬性 property

屬性用於表徵類別的狀態,從存取的形式來看,屬性與成員變數沒有區別。但是,成員變數是就類別的結構構成而言的概念,而屬性是就類別的功能邏輯而言的概念

Q: 屬性和成員變數有什麼區別嗎?

  • 成員變數是一個「內」概念,反映的是類別的結構構成。屬性是一個「外」概念,反映的是類別的邏輯意義。

  • 成員變數沒有讀寫權限控制,而屬性可以指定為唯讀或只寫,或可讀可寫。

  • 成員變數不對讀出作任何後處理,不對寫入作任何預處理,而屬性則可以。

  • public成員變數可以視為一個可讀可寫、沒有任何預處理或後處理的屬性。 而private成員變數由於外部不可見,與屬性「外」的特性不相符,所以不能視為屬性。

  • 雖然大多數情況下,屬性會由某個或某些成員變數來表示,但屬性與成員變數沒有必然的對應關係, 例如與非門的output 屬性,就沒有一個所謂的$output 成員變數與之對應。

yiibaseObject 提供了對屬性的支援

屬性的實作

<code>class foo extends yii\base\object{
    private $_title;
    
    public function setTitle($title){
        $this->_title = trim($title);
    }
    
    public function getTitle(){
        return $this->_title;
    }
}</code>

屬性能夠對類變量實現更好的封裝,同時構件入口,對成員變量統一管理。

然而__get(), __set()遍歷所有成員變量,找不到匹配的成員變量時才被調用。其效率天生地低於使用成員變數的形式。在一些表示資料結構、資料集合等簡單情況下,且不需讀寫控制等, 可以考慮使用成員變數作為屬性,這樣可以提高一點效率。

自動呼叫 __get() __set() 的時機只是發生在存取不存在的成員變數時。 因此,如果定義了成員變數 public $title 那麼,就算定義了 getTitle() setTitle() , 他們也不會被呼叫。因為 $post->title 時,會直接指向該 public $title。

PHP對於類別方法不區分大小寫,即大小寫不敏感,對屬性名也是不區分大小寫的。

__get() __set() 都是public的,static的方法統統不好使。

Component

Yii自稱是基於組成的框架。

yiibaseComponent繼承自yiibaseObject,Component重載了Object中的屬性方法,同時也加入了事件和行為。

由於重載加入了事件和行為,Component的效能會筆Object差一點。

Object的配置

Yii的物件配置方法是統一的。所有物件的配置都是透過Object中的__construct()來配置。配置的本質就在Yii::configure()中,他透過配置數組,建構屬性。

Q: 如果配置是多維的陣列怎麼辦呢?

Yii在yiidiServiceLocator中實現了對這一數組的具體處理: setComponents

Summary

透過yiibaseObject::__construct(),我們可以看到,所有對象,包括Component的屬性的加載,均有4個階段,(前三個階段是一氣呵成在一起的)。

  1. 預先初始化:預設定義Property

  2. Yii::configure()來載入配置數組,覆寫Property

  3. in初始化:in初始化的執行方法階段。

  4. 參考

http://www.digpage.com/

  1. 以上就介紹了Yii原始碼解讀-屬性,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn