本文实例讲述了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相关内容感兴趣的读者可查看本站专题:《Yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

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

华山资源网 Design By www.eoogi.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
华山资源网 Design By www.eoogi.com

《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线

暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。

艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。

《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。