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教程有兴趣的朋友有所帮助。