# 屬性和配置
屬性和配置的設計借鑒于 Yii 框架,Blink 實現的 Yii 框架中該特性的子集,如果您對 Yii 的這套理念熟悉,本節只需簡單看看即可。如果不熟,您也可以參考 Yii 的[相關文檔](https://github.com/yiisoft/yii2/blob/master/docs/guide/concept-configurations.md)?獲得更詳細的信息。
## 屬性
Blink 利用 PHP 的魔術方法實現了增強版的對象屬性,通過增強版的屬性實現,我們可以在讀或者寫屬性的時候執行一些自定義的代碼。Blink 通過?`blink\core\Object`?這個類來提供這一特性,它通過定義類的?*getter*?and?*setter*?方法來定義這種屬性,如果一個類需要這種功能,我們只需要 繼承?`blink\core\Object`?類或者他的子類即可。
在下面的實例中,我們通過定義 getLabel() 和 setLabel() 兩個方法定義了 label 這個屬性。相比 PHP 原生提供的屬性,該屬性可以在設置它的值時 自動調用 trim 函數,實現自定義代碼注入:
~~~
use blink\core\Object;
class Foo extends Object
{
private $_label;
public function getLabel()
{
return $this->_label;
}
public function setLabel($value)
{
$this->_label = trim($value);
}
}
~~~
我們也可以只定義 getter 方法而不定義 setter 方法,這樣的屬性叫做 read only 屬性,如果對該類屬性賦值會觸發`blink\core\InvalidCallException`?異常;同樣的,只定義 setter 方法而不定義 getter 方法的屬性叫做 write only 屬性,如果嘗試讀取該類屬性值也會觸發異常。
除了繼承?`blink\core\Object`?這個類,Blink 也提供?`blink\core\ObjectTrait`?和?`blink\core\Configure`?接口,通過使用他們, 我們可以很容易的讓第三方庫的代碼與 Blink 兼容,使用 Blink 提供的 屬性和配置 的特性。
## 配置
配置在 Blink 中廣泛應用于對象創建和初始化已有對象。一個配置通常包含待創建對象的類名和一系列用于初始化該對象屬性的值。下面是一個采用配置創建和 初始化 log 服務的例子:
~~~
$config = [
'class' => 'blink\session\Manager',
'expires' => 3600 * 24 * 15,
'storage' => [
'class' => 'blink\session\FileStorage',
'path' => 'path/to/sessions'
]
];
$session = make($config);
~~~
`make()`?函數是一個采用配置快速創建對象的輔助函數,他先根據配置里包含的類名創建對象,然后再初始化對象的其他屬性。
## 配置格式
一個配置的格式如下:
~~~
[
'class' => 'ClassName',
'propertyName' => 'propertyValue',
// 更多的屬性
]
~~~
其中:
* class 元素指定待創建對象的類名
* propertyName 元素用于初始化對象對應的屬性,key 是屬性名稱,value 是屬性的初始值。注意,只有公開的成員變量和通過 getter 和 setter 定義的屬性可以被配置。