Yii框架getter与setter方法功能与用法分析
本文实例讲述了Yii框架getter与setter方法功能与用法。分享给大家供大家参考,具体如下:
1.属性
在PHP中,类的成员变量也被称为属性。它们是类定义的一部分,用来表现一个实例的状态(也就是区分类的不同实例)。在具体实践中,常常会想用一个稍微特殊些的方法实现属性的读写。例如,如果有需求每次都要对label属性执行trim操作,就可以用以下代码实现:
$object->label=trim($label);
上述代码的缺点是只要修改label属性就必须再次调用trim()函数。若将来需要用其它方式处理label属性,比如首字母大写,就不得不修改所有给label属性赋值的代码。这种代码的重复会导致bug,这种实践显然需要尽可能避免。
为解决该问题,Yii引入了一个名为yii\base\Object的基类,它支持基于类内的getter和setter(读取器和设定器)方法来定义属性。如果某类需要支持这个特性,只需要继承yii\base\Object或其子类即可。
信息:几乎每个Yii框架的核心类都继承自yii\base\Object或其子类。这意味着只要在核心类中见到getter或setter方法,就可以像调用属性一样调用它。
2.讲述
getter方法是名称以get开头的方法,而setter方法名以set开头。方法名中get或set后面的部分就定义了该属性的名字。如下面代码所示,getter方法getLabel()和setter方法setLabel()操作的是label属性,:
namespaceapp\components; useyii\base\BaseObject; classFooextendBaseObject { private$_label; publicfunctiongetLabel() { return$this->_label; } publicfunctionsetLabel($value) { $this->_label=trim($value); } }
(详细解释:getter和setter方法创建了一个名为label的属性,在这个例子里,它指向一个私有的内部属性_label。)
getter/setter定义的属性用法与类成员变量一样。两者主要的区别是:当这种属性被读取时,对应的getter方法将被调用;而当属性被赋值时,对应的setter方法就调用。如:
//通过方法进行获取属性 //等效于$label=$object->getLabel(); //这个是直接通过属性获取就是说这个属性找不到就会调用方法在方法中进行获取属性 $label=$object->label; //等效于$object->setLabel('abc'); $object->label='abc';
只定义了getter没有setter的属性是只读属性。尝试赋值给这样的属性将导致InvalidCallException(无效调用)异常。类似的,只有setter方法而没有getter方法定义的属性是只写属性,尝试读取这种属性也会触发异常。使用只写属性的情况几乎没有。
通过getter和setter定义的属性也有一些特殊规则和限制:
- 这类属性的名字是不区分大小写的。如,$object->label和$object->Label是同一个属性。因为PHP方法名是不区分大小写的。
- 如果此类属性名和类成员变量相同,以后者为准。例如,假设以上Foo类有个label成员变量,然后给$object->label='abc'赋值,将赋给成员变量而不是settersetLabel()方法。
- 这类属性不支持可见性(访问限制)。定义属性的getter和setter方法是public、protected还是private对属性的可见性没有任何影响。
- 这类属性的getter和setter方法只能定义为非静态的,若定义为静态方法(static)则不会以相同方式处理。
- 对不确定有无魔术方法(getter或setter)的属性正常调用property_exists()将不会生效。你应该分别调用canGetProperty()或canSetProperty()。
回到开头提到的问题,与其处处要调用trim()函数,现在我们只需在settersetLabel()方法内调用一次。如果label首字母变成大写的新要求来了,我们只需要修改setLabel()方法,而无须接触任何其它代码。
更多关于Yii相关内容感兴趣的读者可查看本站专题:《Yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。