资讯专栏INFORMATION COLUMN

Yii源码解读-属性

instein / 3045人阅读

摘要:成员变量可以视为一个可读可写没有任何预处理或后处理的属性。而成员变量由于外部不可见,与属性外的特性不相符,所以不能视为属性。在一些表示数据结构数据集合等简单情况下,且不需读写控制等,可以考虑使用成员变量作为属性,这样可以提高一点效率。

Yii基础 属性 property

属性用于表征类的状态,从访问的形式上看,属性与成员变量没有区别。但是,成员变量是就类的结构构成而言的概念,而属性是就类的功能逻辑而言的概念

Q: 属性和成员变量有什么区别吗?

成员变量是一个“内”概念,反映的是类的结构构成。属性是一个“外”概念,反映的是类的逻辑意义。

成员变量没有读写权限控制,而属性可以指定为只读或只写,或可读可写。

成员变量不对读出作任何后处理,不对写入作任何预处理,而属性则可以。

public成员变量可以视为一个可读可写、没有任何预处理或后处理的属性。 而private成员变量由于外部不可见,与属性“外”的特性不相符,所以不能视为属性。

虽然大多数情况下,属性会由某个或某些成员变量来表示,但属性与成员变量没有必然的对应关系, 比如与非门的 output 属性,就没有一个所谓的 $output 成员变量与之对应。

yiiaseObject 提供了对属性的支持

属性的实现
class foo extends yiiaseobject{
    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自称是基于组建的框架。

yiiaseComponent继承自yiiaseObject,Component重载了Object中的属性方法,同时也加入了事件和行为。

由于重载加入了事件和行为,Component的性能会笔Object差一点。

Object的配置

Yii的对象配置方法是统一的。所有对象的配置都是通过Object中的__construct()来配置。配置的本质就在Yii::configure()中,他通过配置数组,构建属性。

Q: 如果配置是多维的数组怎么办呢?

Yii在yiidiServiceLocator中实现了对这一数组的具体处理: setComponents

Summary

通过yiiaseObject::__construct(),我们可以看到,所有对象,包括Component的属性的加载,均有4个阶段,(前三个阶段是一气呵成在一起的)。

预初始化:默认定义Property

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

后初始化:init()的执行

类方法调用阶段。

参考

http://www.digpage.com/

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21438.html

相关文章

  • Yii源码解读-行为

    摘要:行为所要响应的事件重载方法,表示这个行为将对类何种事件进行何种反馈。行为用的最多的,也是对于各种事件的响应。当出现命名冲突时,行为会自行排除冲突,自动使用先绑定的行为。目前还没有能支持行为。 Yii基础 行为(Behavior) 行为(behavior)可以在不修改现有类的情况下,对类的功能进行扩充。 通过将行为绑定到一个类,可以使类具有行为本身所定义的属性和方法,就好像类本来就有这些...

    IntMain 评论0 收藏0
  • Yii源码解读-环境&配置

    摘要:环境需要了解一下一个纯粹的与本地环境密切相关的配置项。对于配置项以数组进行组织。数组元素表示将要创建的对象的完整类名。数组元素表示指定为属性的初始值为。数组元素表示将绑定到对象的事件中。对于形式配置项,视配置值为一个事件,绑定到上。 环境 需要了解一下cookieValidationKey:一个纯粹的、与本地环境密切相关的配置项。 但是,在有些情况下,cookieValidationK...

    cgh1999520 评论0 收藏0
  • Yii源码解读-服务定位器(Service Locator)

    摘要:的目的也是解耦,并且非常适合基于服务和组件的应用。一个类可以在运行时,有针对性地增减替换所要用到的服务,从而得到一定程度的优化。这两个数组均是以服务或组件的为键的数组。用于保存这些组件或服务的定义。这个定义可以是配置数组对象类名参考 SL的目的也是解耦,并且非常适合基于服务和组件的应用。 Service Locator充当了一个运行时的链接器的角色,可以在运行时动态地修改一个类所要选...

    moven_j 评论0 收藏0
  • Yii源码解读-依赖注入(容器)

    摘要:在中使用解耦,有两种注入方式构造函数注入属性注入。对象的实例化解析依赖信息该方法实质上就是通过的反射机制,通过类的构造函数的参数分析他所依赖的单元。 有关概念 依赖倒置原则(Dependence Inversion Principle, DIP) 传统软件设计中,上层代码依赖于下层代码,当下层出现变动时,上层也要相应变化。 DIP的核心思想是:上层定义接口,下层实现这个接口,从而使的下...

    Prasanta 评论0 收藏0
  • Yii源码解读 - 事件

    摘要:事件的绑定和解除对事件进行绑定和解绑。使用全局函数作为来进行绑定使用对象的成员函数来进行绑定使用类的静态成员函数进行绑定使用匿名函数上面的数组是用来维护事件数组。事件的级别类级别事件类级别事件用于响应所有类实例的事件。 Yii基础 事件 event 使用事件,可以在特定的时点,触发执行预先设定的一段代码,事件既是代码解耦的一种方式,也是设计业务流程的一种模式。 事件的相关要素 这是一...

    AaronYuan 评论0 收藏0

发表评论

0条评论

instein

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<