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個階段,(前三個階段是一氣呵成在一起的)。
預先初始化:預設定義Property
Yii::configure()
來載入配置數組,覆寫Property
in初始化:in初始化的執行方法
階段。
參考
http://www.digpage.com/
以上就介紹了Yii原始碼解讀-屬性,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。