Yii框架getter与setter方法功能与用法分析


Posted in PHP onOctober 22, 2019

本文实例讲述了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 属性,:

namespace app\components;
use yii\base\BaseObject;
class Foo extend BaseObject
{
  private $_label;
  public function getLabel()
  {
    return $this->_label;
  }
  public function setLabel($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' 赋值, 将赋给成员变量而不是 setter setLabel() 方法。
  • 这类属性不支持可见性(访问限制)。定义属性的 getter 和 setter 方法是 public、protected 还是 private 对属性的可见性没有任何影响。
  • 这类属性的 getter 和 setter 方法只能定义为非静态的,若定义为静态方法(static)则不会以相同方式处理。
  • 对不确定有无魔术方法(getter 或 setter)的属性正常调用 property_exists() 将不会生效。你应该分别调用 canGetProperty() 或 canSetProperty() 。

回到开头提到的问题,与其处处要调用 trim() 函数, 现在我们只需在 setter setLabel() 方法内调用一次。 如果 label 首字母变成大写的新要求来了,我们只需要修改setLabel() 方法, 而无须接触任何其它代码。

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

PHP 相关文章推荐
用PHPdig打造属于你自己的Google[图文教程]
Feb 14 PHP
PHP 变量类型的强制转换
Oct 23 PHP
elgg 获取文件图标地址的方法
Mar 20 PHP
php方法调用模式与函数调用模式简例
Sep 20 PHP
使用php+apc实现上传进度条且在IE7下不显示的问题解决方法
Apr 25 PHP
php读取文件内容的几种方法详解
Jun 26 PHP
解析isset与is_null的区别
Aug 09 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(六)
Jun 23 PHP
微信公众平台网页授权获取用户基本信息中授权回调域名设置的变动
Oct 21 PHP
ThinkPHP结合AjaxFileUploader实现无刷新文件上传的方法
Oct 29 PHP
在WordPress中安装使用视频播放器插件Hana Flv Player
Jan 04 PHP
详解PHP的Yii框架中组件行为的属性注入和方法注入
Mar 18 PHP
PHP数组对象与Json转换操作实例分析
Oct 22 #PHP
Yii框架where查询用法实例分析
Oct 22 #PHP
Laravel手动返回错误码示例
Oct 22 #PHP
Laravel 6.2 中添加了可调用容器对象的方法
Oct 22 #PHP
浅谈Laravel模板实体转义带来的坑
Oct 22 #PHP
Laravel定时任务的每秒执行代码
Oct 22 #PHP
Laravel框架实现定时Task Scheduling例子
Oct 22 #PHP
You might like
如何在PHP中使用Oracle数据库(4)
2006/10/09 PHP
PHP date函数参数详解
2006/11/27 PHP
php 将excel导入mysql
2009/11/09 PHP
php在服务器执行exec命令失败的解决方法
2012/03/03 PHP
对于ThinkPHP框架早期版本的一个SQL注入漏洞详细分析
2014/07/04 PHP
PHP使用递归生成文章树
2015/04/21 PHP
提高php编程效率技巧
2015/08/13 PHP
Firefox和IE兼容性问题及解决方法总结
2013/10/08 Javascript
Vue2.0 UI框架ElementUI使用方法详解
2017/04/14 Javascript
BetterScroll 在移动端滚动场景的应用
2017/09/18 Javascript
Bootstrap 3多级下拉菜单实例
2017/11/23 Javascript
JavaScript中创建原子的方法总结
2018/08/26 Javascript
微信小程序云开发之使用云数据库
2019/05/17 Javascript
[04:13]2018国际邀请赛典藏宝瓶Ⅱ饰品一览
2018/07/21 DOTA
python获得linux下所有挂载点(mount points)的方法
2015/04/29 Python
使用SAE部署Python运行环境的教程
2015/05/05 Python
浅析Python 中整型对象存储的位置
2016/05/16 Python
详解Python中的__new__、__init__、__call__三个特殊方法
2016/06/02 Python
深入浅出学习python装饰器
2017/09/29 Python
Python tkinter实现的图片移动碰撞动画效果【附源码下载】
2018/01/04 Python
Windows 8.1 64bit下搭建 Scrapy 0.22 环境
2018/11/18 Python
python操作excel让工作自动化
2019/08/09 Python
opencv调整图像亮度对比度的示例代码
2019/09/27 Python
查看端口并杀进程python脚本代码
2019/12/17 Python
django model的update时auto_now不被更新的原因及解决方式
2020/04/01 Python
django教程如何自学
2020/07/31 Python
玩转CSS3色彩
2010/01/16 HTML / CSS
泰国办公用品购物网站:OfficeMate
2018/02/04 全球购物
巴西电子、家电、智能手机购物网站:Girafa
2019/06/04 全球购物
爱尔兰最大的体育零售商:Life Style Sports
2019/06/12 全球购物
十岁生日同学答谢词
2014/01/19 职场文书
道德大讲堂实施方案
2014/05/14 职场文书
2015年医务人员医德医风自我评价
2015/03/03 职场文书
药店营业员岗位职责
2015/04/14 职场文书
毕业论文指导老师意见
2015/06/04 职场文书
Python matplotlib安装以及实现简单曲线的绘制
2022/04/26 Python