资讯专栏INFORMATION COLUMN

浅析Yii2.0的属性Property

arashicage / 1499人阅读

摘要:概念理解第一次看深入理解的时候,我也是懵逼的,属性不就是类的属性吗,有什么好说的。属性的实现步骤继承自。声明一个用于保存该属性的私有成员变量。如果只提供了,那么该属性为只读属性,只提供了,则为只写。

概念理解:第一次看深入理解Yii2.0的时候,我也是懵逼的,属性不就是类的属性吗,有什么好说的。后来才知道Yii框架对成员变量和属性做了区分,那类的成员变量和属性到底是什么关系又有什么区别呢?先看一下比较书面化的说法,"成员变量是就类的结构构成而言的概念,而属性是就类的功能逻辑而言的概念,两者紧密联系又相互区别"。说白点就是属性是业务上抽象出来的概念,并且属性的代码实现依赖于成员变量,但不能说属性就是成员变量,(好像也不是很直白...)并且属性在代码上可以做到控制读写权限,而成员变量就不可以了。
属性的实现步骤

继承自 yiiaseBaseObject

声明一个用于保存该属性的私有成员变量。

提供gettersetter函数,或两者都提供,用于访问、修改上面提到的私有成员变量。 如果只提供了getter,那么该属性为只读属性,只提供了setter,则为只写。

属性的实现demo
_val;
    }

    //控制属性写权限的方法
    public function setTitle($value)
    {
        $this->_val = $value;
    }
}

$obj = new Article();

//获取属性文章标题的值
$obj->title;                            

//设置属性文章标题的值
$obj->title = "mysql从入门到删库";        
        
注意:

上述demo中,$_val 就是成员变量 title 就是一个抽象出来的业务属性。

从Yii2.0.13以后推荐继承的是 yiiaseBaseObject,而不是 yiiaseObject 因为在 php7.2 以后 Object 是保留字,不能再作为类名

那么Yii是怎么通过getTitle()setTitle()函数来控制属性title的读写的呢?其实很简单,通过__get()__set()俩个魔术方法来实现的。

属性的实现原理

下面是类BaseObject里面对于__set()__get()魔术方法的实现。

    public function __get($name)
    {
        $getter = "get" . $name;
        if (method_exists($this, $getter)) {
            return $this->$getter();
        } elseif (method_exists($this, "set" . $name)) {
            throw new InvalidCallException("Getting write-only property: " . get_class($this) . "::" . $name);
        }

        throw new UnknownPropertyException("Getting unknown property: " . get_class($this) . "::" . $name);
    }

    public function __set($name, $value)
    {
        $setter = "set" . $name;
        if (method_exists($this, $setter)) {
            $this->$setter($value);
        } elseif (method_exists($this, "get" . $name)) {
            throw new InvalidCallException("Setting read-only property: " . get_class($this) . "::" . $name);
        } else {
            throw new UnknownPropertyException("Setting unknown property: " . get_class($this) . "::" . $name);
        }
    }
    

当我们读取类Article实例里面title值的时候,会去遍历类Article里面的属性,找不到匹配的属性的时候,就会自动触发__get()魔术方法[注:当调用当前环境下未定义或不可见的类属性时自动触发],在__get()方法里再去调用getTitle()方法。设置属性title同理。[注:由于PHP对于类方法不区分大小写,即大小写不敏感, $obj->getTitle() 和 $obj->gettitle() 是调用相同的函数]

小结

以上总结参考了深入理解Yii2.0[这次可能参考的比较多,嘿嘿],其实以前就看过,但是也只是局限于看过,没有自己跑demo调试、查看源代码,然后就误以为自己明白了,其实过俩天什么都不记得了。所以现在通过写博客来加深自己的理解,由于水平有限,欢迎小伙伴交流和指正。

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

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

相关文章

  • 浅析Yii2.0行为Behavior

    摘要:概念理解使用行为可以在不修改现有类的情况下,对类的功能进行扩充。最后将行为名称和行为实例放到的属性中,至此,行为的绑定就结束了。不过在解除的时候虽然都是删掉相应的,但是解除行为还需要解除在绑定行为的时候绑定的事件,这点不太一样。 概念理解:使用行为(behavior)可以在不修改现有类的情况下,对类的功能进行扩充。 通过将行为绑定到一个类,可以使类具有行为本身所定义的属性和方法,就好像...

    legendmohe 评论0 收藏0
  • 浅析Yii2.0事件Event

    摘要:全局级别利用实例在整个应用的生命周期中全局可访问的特性,来实现这个全局事件的。类级别通过维护类的属性数组,触发事件时通过类名和事件名称取到当前类以及父类的数据,再通过函数触发。 概念理解:在某一个事件(trigger)发生的时候,触发预先设定(on)的代码,这是代码解耦的一种方式。 事件按照级别分为三类 1. 实例级别 绑定事件、触发事件的类继承的是Component,只在当前示例中运...

    李义 评论0 收藏0
  • 重写yii2数据提供器ArrayDataProvider类

    摘要:再看看另一个方法,的提供的数据统计总条数的方法是的,默认计算分页总数是根据数组计算的,而的数据就是我们查询赋值给提供器的。统计总数预处理函数直接获取通过函数获取传递给数据提供器的数据总和。 首先看看ArrayDataProvider官方的doc: ArrayDataProvider implements a data provider based on a data array.Ar...

    xiaokai 评论0 收藏0
  • 浅析Vue响应式原理(三)

    摘要:响应式原理之不论如何,最终响应式数据都要通过来实现,实际要借助新增的。在函数内,首先实例化一个实例,会在稍后添加为响应式数据自定义的中发挥作用。只有数组和对象才可能是响应式,才能返回实例。参考链接技术内幕揭开数据响应系统的面纱源码 Vue响应式原理之defineReactive defineReactive 不论如何,最终响应式数据都要通过defineReactive来实现,实际要借助...

    tomener 评论0 收藏0
  • js面向对象浅析--继承那些事

    摘要:有需要还可以修改指向谦龙寄生组合式继承思路是通过借用构造函数来继承属性,通过原型链的混合形式来继承方法改变执行环境实现继承有需要还可以修改指向谦龙谦龙拷贝继承该方法思路是将另外一个对象的属性和方法拷贝至另一个对象使用递归 前言 js中实现继承的方式只支持实现继承,即继承实际的方法,而实现继承主要是依靠原型链来完成的。 原型链式继承 该方式实现的本质是重写原型对象,代之以一个新类型的实例...

    molyzzx 评论0 收藏0

发表评论

0条评论

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