欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

Yii源码解读-属性

程序员文章站 2022-05-27 14:02:31
...
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个阶段,(前三个阶段是一气呵成在一起的)。

  1. 预初始化:默认定义Property

  2. Yii::configure()来加载配置数组,覆盖Property

  3. 后初始化:init()的执行

  4. 类方法调用阶段。

参考

  1. http://www.digpage.com/

以上就介绍了Yii源码解读-属性,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。