Yii源码解读-属性

韩瑶
• 阅读 1554

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/

点赞
收藏
评论区
推荐文章
Irene181 Irene181
4年前
一篇文章带教会你Python访问限制那些事儿
一、前言在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑。二、案例分析以Teacher类的定义来看,外部代码还是可以自由地修改一个实例的name、score属性。classTeacher(object):definit(self,name,score):s
Wesley13 Wesley13
3年前
java中一些常考知识
一、static的作用 static是修饰符,用于修饰成员变量(静态变量/类变量)。static修饰的成员被所有对象共享。static优先于对象存在。static修饰的成员可以用类名.静态成员来访问。注:1.静态方法只能访问静态成员,非静态方法既能访问静态成员又可以访问非静态成员。2.静态方法中不可
Wesley13 Wesley13
3年前
java中的类与对象(1)
    首先理解一下类和对象的关系,可以说:类是对象的抽象,对象是类的实例。类一个类中,通常上包含了属性和功能。属性通常用变量表达,功能通常上用函数表达。编写一个类class类名{//属性,用变量表达//功能,用函数表达}对象实例化对象的方法及含义:类名 对象名 new 
Wesley13 Wesley13
3年前
Java类和对象
一、类类是封装对象的属性和行为的载体,在Java语言中对象的属性以成员变量的形式存在,而对象的方法以成员方法的形式存在。1\.类的构造方法构造方法是一个与类同名的方法,对象的创建就是通过构造方法完成的,构造方法分为有参构造方法和无参构造方法,区别就在于有没有参数。说这么多概念是不是感觉有点麻木,直接看下面的例子吧。pub
Wesley13 Wesley13
3年前
@JsonProperty注解的使用
遇到一个问题,前端按照平常方式传给我json对象,属性名和我一致,我在controller层也按平常方式使用@RequestBody注解,用相应的实体类接收参数,但别人可以成功接到参数,而我的却不能,在实体类的成员变量上增加@JsonProperty("属性名"),就解决了问题查了一下这个注解:@JsonProperty此注解用于属性上,作用是把该
Wesley13 Wesley13
3年前
Java深究之final、finally、finalize三者的区别
       在java中final、finally、finalize三者在写法上很相近,但是实际含义和作用却是相差甚远。本文主要是来深层的研究下这三者的用法以及之间的区别1.final属性:java中的关键字,修饰符作用:用于修饰类、成员方法、变量(成员变量、局部变量)用法:如果类被声明为final,那么该类就不能再派生出新的子类
Wesley13 Wesley13
3年前
DAOMYSQLI工具类
<?php//DAOMySQLI.class.php//完成对mysql数据库操作,单例模式//开发类//1.定类名//2.定成员属性//3.定成员方法查询,dml操作
Wesley13 Wesley13
3年前
Java之面向对象3.1.3
publicclassPerson{      //成员变量   privateStringname; //姓名   privateintage;      //年龄      //公共的设置属性的方法:setter   publicvoidsetName(Stringname)
Easter79 Easter79
3年前
Swift讲解专题十一——属性
Swift讲解专题十一——属性一、引言      属性将值与类,结构体,枚举进行关联。Swift中的属性分为存储属性和计算属性两种,存储属性用于存储一个值,其只能用于类与结构体,计算属性用于计算一个值,其可以用于类,结构体和枚举。二、存储属性      存储属性使用变量或者常量来存储一个
小万哥 小万哥
1年前
深入剖析 Java 类属性与类方法的应用
Java类属性Java类属性,也称为字段,是类中的变量。它们用于存储与类相关的数据。创建类属性在类定义中声明属性:javapublicclassMainintx;//属性Stringname;//属性访问类属性使用点语法访问对象的属性:javaMainmy
小万哥 小万哥
1年前
C++ 访问说明符详解:封装数据,控制访问,提升安全性
C访问说明符访问说明符是C中控制类成员(属性和方法)可访问性的关键字。它们用于封装类数据并保护其免受意外修改或滥用。三种访问说明符:public:允许从类外部的任何地方访问成员。private:仅允许在类内部访问成员。protected:允许在类内