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 相关文章推荐
层叠菜单的动态生成
Oct 09 PHP
支持oicq头像的留言簿(二)
Oct 09 PHP
PHP性能优化准备篇图解PEAR安装
Dec 05 PHP
php查找任何页面上的所有链接的方法
Dec 03 PHP
php制作中间带自己定义图片二维码的方法
Jan 27 PHP
一个严格的PHP Session会话超时时间设置方法
Jun 10 PHP
php按字符无乱码截取中文的方法
Mar 27 PHP
PHPExcel笔记, mpdf导出
May 03 PHP
浅谈socket同步和异步、阻塞和非阻塞、I/O模型
Dec 15 PHP
php中文乱码问题的终极解决方案汇总
Aug 01 PHP
PHP ADODB实现事务处理功能示例
May 25 PHP
Django 标签筛选的实现代码(一对多、多对多)
Sep 05 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
phpMyAdmin 安装及问题总结
2009/05/28 PHP
php环境下利用session防止页面重复刷新的具体实现
2014/01/09 PHP
php中的filesystem文件系统函数介绍及使用示例
2014/02/13 PHP
Symfony2框架学习笔记之HTTP Cache用法详解
2016/03/18 PHP
laravel中的错误与日志用法详解
2016/07/26 PHP
Thinkphp和Bootstrap结合打造个性的分页样式(推荐)
2016/08/01 PHP
php从数据库读取数据,并以json格式返回数据的方法
2018/08/21 PHP
一文看懂PHP进程管理器php-fpm
2020/06/01 PHP
jquery弹出框的用法示例(一)
2013/08/26 Javascript
浅析JavaScript中的delete运算符
2013/11/30 Javascript
深入理解jQuery中live与bind方法的区别
2013/12/18 Javascript
js实现字符串的16进制编码不加密
2014/04/25 Javascript
jquery读取xml文件实现省市县三级联动的方法
2015/05/29 Javascript
js实现iPhone界面风格的单选框和复选框按钮实例
2015/08/18 Javascript
jQuery热气球动画半透明背景的后台登录界面代码分享
2015/08/28 Javascript
微信小程序 开发工具快捷键整理
2016/10/31 Javascript
jQuery 插件实现随机自由弹跳气泡样式
2017/01/12 Javascript
详解angularjs 学习之 scope作用域
2018/01/15 Javascript
小程序开发基础之view视图容器
2018/08/21 Javascript
vue.js中proxyTable 转发请求的实现方法
2018/09/20 Javascript
JS高阶函数原理与用法实例分析
2019/01/15 Javascript
angular 表单验证器验证的同时限制输入的实现
2019/04/11 Javascript
理理Vue细节(推荐)
2019/04/16 Javascript
[46:03]LGD vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[59:00]OG vs TNC 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python下使用Psyco模块优化运行速度
2015/04/05 Python
简单介绍使用Python解析并修改XML文档的方法
2015/10/15 Python
python 文本单词提取和词频统计的实例
2018/12/22 Python
set在python里的含义和用法
2019/06/24 Python
python argparse模块通过后台传递参数实例
2020/04/20 Python
英国著名的化妆品折扣网站:Allbeauty.com
2016/07/21 全球购物
KIEHL’S科颜氏官方旗舰店:源自美国的顶级护肤品牌
2018/06/07 全球购物
以太网Ethernet IEEE802.3
2013/08/05 面试题
应届生煤化工求职信
2013/10/21 职场文书
科技之星事迹材料
2014/06/02 职场文书
干货分享:推荐信写作技巧!
2019/06/21 职场文书