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 相关文章推荐
在php MYSQL中插入当前时间
Apr 06 PHP
php中强制下载文件的代码(解决了IE下中文文件名乱码问题)
May 09 PHP
php中CI操作多个数据库的代码
Jul 05 PHP
析构函数与php的垃圾回收机制详解
Oct 28 PHP
php缩小png图片不损失透明色的解决方法
Dec 25 PHP
Apache PHP MySql安装配置图文教程
Aug 27 PHP
分享一个漂亮的php验证码类
Sep 29 PHP
windows下的WAMP环境搭建图文教程(推荐)
Jul 27 PHP
PHP获取文件扩展名的常用方法小结【五种方式】
Apr 27 PHP
PHP安装BCMath扩展的方法
Feb 13 PHP
PHP之多条件混合筛选功能的实现方法
Oct 09 PHP
Laravel的加密解密与哈希实例讲解
Mar 24 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面向对象全攻略 (十五) 多态的应用
2009/09/30 PHP
php selectradio和checkbox默认选择的实现方法详解
2013/06/29 PHP
php+mysqli实现将数据库中一张表信息打印到表格里的方法
2015/01/28 PHP
CI(Codeigniter)的Setting增强配置类实例
2016/01/06 PHP
CI(CodeIgniter)模型用法实例分析
2016/01/20 PHP
php语言的7种基本的排序方法
2020/12/28 PHP
php使用自定义函数实现汉字分割替换功能示例
2017/01/30 PHP
php swoole多进程/多线程用法示例【基于php7nts版】
2019/08/12 PHP
Laravel6.2中用于用户登录的新密码确认流程详解
2019/10/16 PHP
我的NodeJs学习小结(一)
2014/07/06 NodeJs
JS 获取鼠标左右键的键值方法
2014/10/11 Javascript
Node.js中的缓冲与流模块详细介绍
2015/02/11 Javascript
创建你的第一个AngularJS应用的方法
2015/06/16 Javascript
javascript中数组和字符串的方法对比
2016/07/20 Javascript
JavaScript中绑定事件的三种方式及去除绑定
2016/11/05 Javascript
使用nodejs下载风景壁纸
2017/02/05 NodeJs
详解vue-router2.0动态路由获取参数
2017/06/14 Javascript
vue页面切换到滚动页面显示顶部的实例
2018/03/13 Javascript
nuxt踩坑之Vuex状态树的模块方式使用详解
2019/09/06 Javascript
JS通过识别id、value值对checkbox设置选中状态
2020/02/19 Javascript
Vue + Scss 动态切换主题颜色实现换肤的示例代码
2020/04/27 Javascript
[51:29]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第一场 11.05
2020/11/05 DOTA
python实现的简单抽奖系统实例
2015/05/22 Python
Python使用bs4获取58同城城市分类的方法
2015/07/08 Python
Python基础教程之浅拷贝和深拷贝实例详解
2017/07/15 Python
对python 判断数字是否小于0的方法详解
2019/01/26 Python
Python Web版语音合成实例详解
2019/07/16 Python
Django 创建新App及其常用命令的实现方法
2019/08/04 Python
如何在 Matplotlib 中更改绘图背景的实现
2020/11/26 Python
美国高端寝具品牌:Coyuchi
2017/02/08 全球购物
美丽的现代设计家具:2Modern
2018/07/26 全球购物
Nike澳大利亚官网:Nike.com (AU)
2019/06/03 全球购物
大学生创业计划书怎么写
2014/09/15 职场文书
四风批评与自我批评范文
2014/10/14 职场文书
物业项目经理岗位职责
2015/04/01 职场文书
文艺晚会开场白
2015/05/29 职场文书