概念理解分析:初读深入理解Yii2.0时,我也是一头雾水。属性不只是类属性吗?我能说什么?后来才知道Yii框架是区分成员变量和属性的。那类成员变量和属性有什么关系呢?先看写的比较多的说法,“成员变量是类结构组成方面的概念,而属性是类功能逻辑方面的概念,两者既有联系又有区别。”说白了,属性在业务中是抽象的概念,属性的代码实现依赖于成员变量,但是不能说属性就是成员变量(好像不是很直白。。。)并且可以在代码中控制属性读写权限,但不允许成员变量。属性的实现步骤继承自yii\base\BaseObject。声明一个私有成员变量来保存这个属性。提供getter或setter函数,或两者,用于访问和修改上述私有成员变量。如果仅提供getter,则该属性是只读的,如果仅提供setter,则该属性是只写的。属性实现demo_val;}//控制属性写权限的方法publicfunctionsetTitle($value){$this->_val=$value;}}$obj=newArticle();//获取属性文章标题的值$obj->title;//设置文章属性title的值$obj->title='Mysql从入门到删除数据库';注意:上面的demo中,$_val是成员变量title,是一个抽象的业务属性。Yii2.0.13之后,建议继承yii\base\BaseObject,而不是yii\base\Object,因为Object是php7.2之后的保留字,不能再作为类名使用。那么Yii是如何通过getTitle()和setTitle()函数来控制属性title的读写呢?其实很简单,通过__get()和__set()这两个神奇的方法。属性的实现原理下面是BaseObject类中__set()和__get()魔术方法的实现。公共函数__get($name){$getter='get'.$名称;如果(method_exists($this,$getter)){返回$this->$getter();}elseif(method_exists($this,'set'.$name)){thrownewInvalidCallException('Gettingwrite-onlyproperty:'.get_class($this).'::'.$name);}thrownewUnknownPropertyException('获取未知属性:'.get_class($this).'::'.$name);}公共函数__set($name,$value){$setter='set'.$名称;如果(method_exists($this,$setter)){$this->$setter($value);}elseif(method_exists($this,'get'.$name)){thrownewInvalidCallException('设置只读属性:'.get_class($this).'::'.$name);}else{thrownewUnknownPropertyException('设置未知属性:'。get_class($this)。'::'。$name);当我们读取类Article实例中的title值时,我们会遍历Article中的类Attributes,没有找到匹配的属性当它处于激活状态时,会自动触发__get()魔术方法[注意:在当前环境调用未定义或不可见的类属性时自动触发],然后在__get()方法中调用getTitle()方法设置的属性title是一样的。【注意:由于PHP对类方法不区分大小写,即不区分大小写,$obj->getTitle()和$obj->gettitle()调用的是同一个函数】总结以上总结参考了in-深入理解Yii2.0【这次可能参考了很多,呵呵】,其实之前也看过,但仅限于看过而已。没有运行demo调试,查看源码,然后误以为自己看懂了。其实过了两天,一切都想不起来了。所以现在想通过写博客来加深自己的理解。由于本人水平有限,欢迎各位朋友交流指正。
