Yii基礎
屬性 property
屬性用於表徵類的狀態,從訪問的形式上看,屬性與成員變數沒有區別。但是,成員變數是就類的結構構成而言的概念,而屬性是就類的功能邏輯而言的概念
Q: 屬性和成員變數有什麼區別嗎?
成員變數是一個“內”概念,反映的是類的結構構成。屬性是一個“外”概念,反映的是類的邏輯意義。
成員變數沒有讀寫權限控制,而屬性可以指定為唯讀或唯寫,或可讀可寫。
成員變數不對讀出作任何後處理,不對寫入作任何預先處理,而屬性則可以。
public成員變數可以視為一個可讀可寫、沒有任何預先處理或後處理的屬性。 而private成員變數由於外部不可見,與屬性“外”的特性不相符,所以不能視為屬性。
雖然大多數情況下,屬性會由某個或某些成員變數來表示,但屬性與成員變數沒有必然的對應關係, 比如與非門的 output 屬性,就沒有一個所謂的 $output 成員變數與之對應。
由 yii\base\Object 提供了對屬性的支援
屬性的實現
class foo extends yii\base\object{ private $_title; public function setTitle($title){ $this->_title = trim($title); } public function getTitle(){ return $this->_title; }}
屬效能夠對類實現更好的封裝,同時構件入口,對成員變數統一管理。
然而__get(), __set()遍曆所有成員變數,找不到匹配的成員變數時才被調用。其效率天生地低於使用成員變數的形式。在一些表示資料結構、資料集合等簡單情況下,且不需讀寫控制等, 可以考慮使用成員變數作為屬性,這樣可以提高一點效率。
自動調用 __get() __set() 的時機僅僅發生在訪問不存在的成員變數時。 因此,如果定義了成員變數 public $title 那麼,就算定義了 getTitle() setTitle() , 他們也不會被調用。因為 $post->title 時,會直接指向該 public $title。
PHP對於類方法不區分大小寫,即大小寫不敏感,對屬性名稱也是不區分大小寫。
__get() __set() 都是public的,static的方法統統不好使。
Component
Yii自稱是基於組建的架構。
yii\base\Component繼承自yii\base\Object,Component重載了Object中的屬性方法,同時也加入了事件和行為。
由於重載加入了事件和行為,Component的效能會筆Object差一點。
Object的配置
Yii的對象配置方法是統一的。所有對象的配置都是通過Object中的__construct()來配置。配置的本質就在Yii::configure()中,他通過配置數組,構建屬性。
Q: 如果配置是多維的數組怎麼辦呢?
Yii在yii\di\ServiceLocator中實現了對這一數組的具體處理: setComponents。
Summary
通過yii\base\Object::__construct(),我們可以看到,所有對象,包括Component的屬性的載入,均有4個階段,(前三個階段是一氣呵成在一起的)。
預初始化:預設定義Property
Yii::configure()來載入配置數組,覆蓋Property
後初始化:init()的執行
類方法調用階段。
參考
http://www.digpage.com/
以上就介紹了Yii源碼解讀-屬性,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。