属性赋值的代码,label 属性赋值的代码

在 PHP 中,类的成员变量也被称为属性。它们是类定义的一部分,用来表现一个实例的状态。在具体实践中,常常会想用一个稍微特殊些的方法实现属性的读写。例如,如果有需求每次都要对 label 属性执行 trim 操作,就可以用以下代码实现:

本文实例讲述了Yii框架getter与setter方法功能与用法。分享给大家供大家参考,具体如下:

之前我们说过 Yii2 中大多数类都继承自 yiibaseObject,今天就让我们来看一下这个类。

$object->label = trim;

1.属性

Object 是一个基础类,实现了属性的功能,其基本内容如下:

上述代码的缺点是只要修改 label 属性就必须再次调用 trim() 函数。若将来需要用其它方式处理 label 属性,比如首字母大写,就不得不修改所有给 label 属性赋值的代码。这种代码的重复会导致 bug,这种实践显然需要尽可能避免。

在 PHP 中,类的成员变量也被称为属性。它们是类定义的一部分, 用来表现一个实例的状态。 在具体实践中,常常会想用一个稍微特殊些的方法实现属性的读写。 例如,如果有需求每次都要对 label 属性执行 trim 操作, 就可以用以下代码实现:

<?php
namespace yiibase;

use Yii;

/**
 * Object 是一个基础类,实现了属性的功能
 * Yii最基础的类,大多数类都继承了该类
 */
class Object implements Configurable
{
    /**
     * 获取静态方法调用的类名。返回类的名称,如果不是在类中调用则返回 FALSE。
     */
    public static function className()
    {
        ...
    }

    /**
     * Constructor.
     */
    public function __construct($config = [])
    {
        ...
    }

    /**
     * 初始化对象
     */
    public function init()
    {
    }

    /**
     * 魔术方法,实现 getter
     */
    public function __get($name)
    {
        ...
    }

    /**
     * 魔术方法,实现 setter
     */
    public function __set($name, $value)
    {
        ...
    }

    /**
     * 魔术方法,实现 isset,基于 getter 实现,有 getter 方法的属性才算存在
     */
    public function __isset($name)
    {
        ...
    }

    /**
     * 魔术方法,实现 unset,基于 setter 实现,有 setter 方法的属性才能 unset 掉
     */
    public function __unset($name)
    {
        ...
    }

    /**
     * Calls the named method which is not a class method.
     */
    public function __call($name, $params)
    {
        ...
    }

    /**
     * 检查对象或类是否具有 $name 属性,如果 $checkVars 为 true,则不局限于是否有 getter/setter
     */
    public function hasProperty($name, $checkVars = true)
    {
        ...
    }

    /**
     * 检查对象或类是否能够获取 $name 属性,如果 $checkVars 为 true,则不局限于是否有 getter
     */
    public function canGetProperty($name, $checkVars = true)
    {
        ...
    }

    /**
     * 检查对象或类是否能够设置 $name 属性,如果 $checkVars 为 true,则不局限于是否有 setter
     */
    public function canSetProperty($name, $checkVars = true)
    {
        ...
    }

    /**
     * 检查对象或类是否具有 $name 方法
     */
    public function hasMethod($name)
    {
        ...
    }
}

为解决该问题,Yii 引入了一个名为 yiibaseObject 的基类,它支持基于类内的 getter 和 setter方法来定义属性。如果某类需要支持这个特性,只需要继承 yiibaseObject 或其子类即可。

$object->label = trim;

如果想看详细的注释的话,可以访问 

补充:几乎每个 Yii 框架的核心类都继承自 yiibaseObject 或其子类。这意味着只要在核心类中见到 getter 或 setter 方法,就可以像调用属性一样调用它。getter 方法是名称以 get 开头的方法,而 setter 方法名以 set 开头。方法名中 get 或 set 后面的部分就定义了该属性的名字。如下面代码所示,getter 方法 getLabel() 和 setter 方法 setLabel() 操作的是 label 属性,:

上述代码的缺点是只要修改 label 属性就必须再次调用 trim() 函数。 若将来需要用其它方式处理 label 属性,比如首字母大写, 就不得不修改所有给 label 属性赋值的代码。这种代码的重复会导致 bug, 这种实践显然需要尽可能避免。

从上面的内容中,我们可以看到 Object 类重写了 __get 和 __set 方法,下面我们来详细看下这两个方法:

namespace appcomponents;use yiibaseObject;class Foo extend Object{ private $_label; public function getLabel() { return $this->_label; } public function setLabel { $this->_label = trim; }}

为解决该问题,Yii 引入了一个名为 yiibaseObject 的基类, 它支持基于类内的 getter 和 setter方法来定义属性。 如果某类需要支持这个特性,只需要继承 yiibaseObject 或其子类即可。

    /**
     * Returns the value of an object property.
     *
     * Do not call this method directly as it is a PHP magic method that
     * will be implicitly called when executing `$value = $object->property;`.
     *
     * 魔术方法,实现 getter
     *
     * @param string $name the property name
     * @return mixed the property value
     * @throws UnknownPropertyException if the property is not defined
     * @throws InvalidCallException if the property is write-only
     * @see __set()
     */
    public function __get($name)
    {
        $getter = 'get' . $name;
        if (method_exists($this, $getter)) {
            // 对象存在 $getter 方法,就直接调用
            return $this->$getter();
        } elseif (method_exists($this, 'set' . $name)) {
            // 如果存在 'set' . $name 方法,就认为该属性是只写的
            throw new InvalidCallException('Getting write-only property: ' . get_class($this) . '::' . $name);
        } else {
            // 否则认为该属性不存在
            throw new UnknownPropertyException('Getting unknown property: ' . get_class($this) . '::' . $name);
        }
    }

    /**
     * Sets value of an object property.
     *
     * Do not call this method directly as it is a PHP magic method that
     * will be implicitly called when executing `$object->property = $value;`.
     *
     * 魔术方法,实现 setter
     *
     * @param string $name the property name or the event name
     * @param mixed $value the property value
     * @throws UnknownPropertyException if the property is not defined
     * @throws InvalidCallException if the property is read-only
     * @see __get()
     */
    public function __set($name, $value)
    {
        $setter = 'set' . $name;
        if (method_exists($this, $setter)) {
            // 对象存在 $setter 方法,就直接调用
            $this->$setter($value);
        } elseif (method_exists($this, 'get' . $name)) {
            // 如果存在 'get' . $name 方法,就认为该属性是只读的
            throw new InvalidCallException('Setting read-only property: ' . get_class($this) . '::' . $name);
        } else {
            // 否则认为该属性不存在
            throw new UnknownPropertyException('Setting unknown property: ' . get_class($this) . '::' . $name);
        }
    }

(详细解释:getter 和 setter 方法创建了一个名为 label 的属性,在这个例子里,它指向一个私有的内部属性 _label。)

信息: 几乎每个 Yii 框架的核心类都继承自 yiibaseObject 或其子类。 这意味着只要在核心类中见到 getter 或 setter 方法,就可以像调用属性一样调用它。

基于上面的代码,我们可以看到,如果访问一个 Object 对象的某个属性, Yii会调用名为 get属性名() 的函数。如, SomeObject->Foo , 会自动调用 SomeObject->getFoo()。 如果修改某一属性,会调用相应的setter函数。 如, SomeObject->Foo = $someValue ,会自动调用 SomeObject->setFoo($someValue) 。

getter/setter 定义的属性用法与类成员变量一样。两者主要的区别是:当这种属性被读取时,对应的 getter 方法将被调用;而当属性被赋值时,对应的 setter 方法就调用。如:

2.讲述

以 SomeObject 的 Foo 为例,如果只存在 getFoo() 方法,那它就是只读的,如果只存在 setFoo() 方法,那它就是只写的,只有两个方法都存在的时候才是既可读又可写的。

// 等效于 $label = $object->getLabel();$label = $object->label;// 等效于 $object->setLabel;$object->label = 'abc';

getter 方法是名称以 get 开头的方法,而 setter 方法名以 set 开头。 方法名中 get 或 set 后面的部分就定义了该属性的名字。如下面代码所示, getter 方法 getLabel() 和 setter 方法 setLabel() 操作的是 label 属性,:

需要注意的一点是只有在读取和写入对象的一个不存在的成员变量时, __get() __set() 会被自动调用。 如果 Foo 是一个 public 的属性就不会经过 __get() 和 __set() 方法了。

只定义了 getter 没有 setter 的属性是只读属性。尝试赋值给这样的属性将导致 yiibaseInvalidCallException 异常。类似的,只有 setter 方法而没有 getter 方法定义的属性是只写属性,尝试读取这种属性也会触发异常。使用只写属性的情况几乎没有。

namespace appcomponents;use yiibaseBaseObject;class Foo extend BaseObject{ private $_label; public function getLabel() { return $this->_label; } public function setLabel { $this->_label = trim; }}

所以通常属性是 private 的,举个例子如下:

通过 getter 和 setter 定义的属性也有一些特殊规则和限制:

(详细解释:getter 和 setter 方法创建了一个名为 label 的属性, 在这个例子里,它指向一个私有的内部属性 _label。)

class User extends yiibaseObject
{
    private $_name;

    public function getName()
    {
        return $this->_name;
    }

    public function setName($name)
    {
        $this->_name = trim($name);
    }
}

这类属性的名字是不区分大小写的。如,$object->label 和 $object->Label 是同一个属性。因为 PHP 方法名是不区分大小写的。如果此类属性名和类成员变量相同,以后者为准。例如,假设以上 Foo 类有个 label 成员变量,然后给 $object->label = 'abc' 赋值,将赋给成员变量而不是 setter setLabel。定义属性的 getter 和 setter 方法是 public、protected 还是 private 对属性的可见性没有任何影响。这类属性的 getter 和 setter 方法只能定义为非静态的,若定义为静态方法则不会以相同方式处理。回到开头提到的问题,与其处处要调用 trim() 函数,现在我们只需在 setter setLabel() 方法内调用一次。如果 label 首字母变成大写的新要求来了,我们只需要修改setLabel() 方法,而无须接触任何其它代码。

getter/setter 定义的属性用法与类成员变量一样。两者主要的区别是: 当这种属性被读取时,对应的 getter 方法将被调用;而当属性被赋值时, 对应的 setter 方法就调用。如:

我们还可以在 get 和 set 方法中做一些特殊的处理。

本文由美高梅游戏网站登录发布于美高梅棋牌游戏,转载请注明出处:属性赋值的代码,label 属性赋值的代码

您可能还会对下面的文章感兴趣: