资讯专栏INFORMATION COLUMN

Yii2 框架核心概念之属性(手册翻译)

awesome23 / 2110人阅读

摘要:属性在里,类的成员变量也被称之为属性,这些变量是类定义的一部分,被用来表示类实例的状态区分不同类实例。不同之处在于,当属性被读时,关联的方法被调用,当属性被修改时,关联的方法被调用。

属性

在PHP里,类的成员变量也被称之为属性,这些变量是类定义的一部分,被用来表示类实例的状态(区分不同类实例)。在具体的实践中,你可能要经常处理可读或者可写属性的特殊方式,举个例子, 你可能想要给属性$label赋值一个字符串,但是这个字符串必须使用trim函数过滤开头结尾的空格,为了完成这个特殊处理你可能需要使用如下代码

$object->label = trim($label);

上述代码的缺点是,凡是在给label属性赋值的时候,你都必须使用trim函数去处理。假设在以后label属性的首字母必须大写,那么凡是给label属性赋值的代码,就必须被修改。你应该尽可能的避免这种代码重复。

为了解决这个问题,yii引入了一个基础类[yiiaseObject],此类可以基于类的getter和setter方法来定义类属性。如果一个类需要以这种方式定义属性,继承[yiiaseObject]或者[yiiaseObject]的子类

  

提示:几乎所有yii2框架的核心类都继承了[yiiaseObject]类或者它的子类,这意味着核心类的getter或者setter方法你都可以以属性的方式使用

getter方法一get为前缀;setter方法以set为前缀,get或者set后面跟随属性的名称。举个例子,getLabel()和setLabel()定义了label属性,实现代码如下

namespace appcomponents;

use yiiaseObject;

class Foo extend Object
{
    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方法,那么此属性只读,尝试给该属性赋值的行为都会抛出一个[[yiiaseInvalidCallException|InvalidCallException]]异常。同样,假设定义了setter方法的属性没有getter方法,此属性只写,尝试读取只写属性的值也会抛出一个异常,只写属性不常见。

通过getter,setter方法定义的属性有几个特殊的规则和限制

此类属性大小写不敏感。比如:$object->label 和 $object->Label 是相同的,

使用getter,setter定义的属性如果在类中同时拥有同名的成员变量,同名的成员变量将会被优先使用。比如: Foo类有一个成员变量label,$foo->label = "test" 将会直接给label赋值,而不会调用setLabel()方法

此类属性不支持可见度。即无论属性的getter或者setter方法定义为public,protected,private,都没有区别

此类属性只能有非静态的getter,setter方法来定义,静态方法不会以相同的方式来处理

回到开头的问题,假设需要给label属性赋值,且要对值处理,替代在所有赋值代码处处理,而是在setter方法里处理所要赋予属性的值,当有任何新的需求或者规则施加在属性上时,只需要修改getter或者setter方法。修改一处,所以地方都生效。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/20763.html

相关文章

  • Yii2 框架核心概念组件(手册翻译)

    摘要:可以在方法里实现例行检查和属性正常化检查对象方法调用开始的三个阶段都在构造函数里实现,这意味着当你得到一个对象的实例时,它已经被初始化为适当的状态,可以被放心的使用。 组件 组件是YII框架application(应用)的主要组成部分,它是 [yiiaseComponent]的实例或者子类。组件有三个重要特征(功能): 属性(properties) 事件(events) 行为(...

    nemo 评论0 收藏0
  • Yii修行路 - Extension 扩展

    摘要:运行来安装指定的扩展。这更便于用户辨别是否是的扩展。当用户运行安装一个扩展时,文件会被自动更新使之包含新扩展的信息。上述代码表明该扩展依赖于包。例如,上述的条目声明将对应于别名。为达到这个目的,你应当在公开发布前做测试。 简述 扩展是专门设计的在 Yii 应用中随时可拿来使用的, 并可重发布的软件包。 基础 例如, yiisoft/yii2-debug 扩展在你的应用的每个页面底部添加...

    bovenson 评论0 收藏0
  • SegmentFault 社区访谈 | mcfog:自由进出 Coding && A

    摘要:上次的访谈,介绍了下可爱的依云酱,回忆传送门。这里简单地介绍下龙女仆,全名小林家的龙女仆,为什么介绍这部剧呢因为设计狮颜值同学也安利了这部。剧情简介在独身又劳累的小林划重点一名程序员身边突然出现的穿着女仆服装的美少女托尔。 showImg(https://segmentfault.com/img/bVR6p5?w=900&h=385); 上次的访谈,介绍了下可爱的依云酱,回忆传送门。不...

    neroneroffy 评论0 收藏0
  • SegmentFault 社区访谈 | mcfog:自由进出 Coding && A

    摘要:上次的访谈,介绍了下可爱的依云酱,回忆传送门。这里简单地介绍下龙女仆,全名小林家的龙女仆,为什么介绍这部剧呢因为设计狮颜值同学也安利了这部。剧情简介在独身又劳累的小林划重点一名程序员身边突然出现的穿着女仆服装的美少女托尔。 showImg(https://segmentfault.com/img/bVR6p5?w=900&h=385); 上次的访谈,介绍了下可爱的依云酱,回忆传送门。不...

    lx1036 评论0 收藏0
  • Yii2.0 RESTful API 速率限制

    摘要:之速率限制什么是速率限制权威指南翻译过来为限流,为防止滥用,你应该考虑对您的限流。如果在规定的时间内接收了一个用户大量的请求,将返回响应状态代码这意味着过多的请求。 Yii2.0 RESTful API 之速率限制 什么是速率限制? 权威指南翻译过来为限流,为防止滥用,你应该考虑对您的 API 限流。 例如,您可以限制每个用户 10 分钟内最多调用 API 100 次。 如果在规定的时...

    LeviDing 评论0 收藏0

发表评论

0条评论

awesome23

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<