yii 2.0 属性 - 在线留言 - 长春市隆兴伟业物流有限公司
现在的位置: 主页 > 在线留言 > 文章正文
yii 2.0 属性
作者:长春市隆兴伟业物流有限公司 来源:www.lxwywl.com 发布时间:2017-09-08 22:00:13
yii 2.0 属性

属性用于表征类的状态,从访问的形式上看,属性与成员变量没有区别。 你能一眼看出$object->foo中的foo是成员变量还是属性么?显然不行。 但是,成员变量是就类的结构构成而言的概念,而属性是就类的功能逻辑而言的概念,两者紧密联系又 相互区别。比如,我们说People类有一个成员变量int$age,表示年龄。那么这里年龄就是属性 ,$age就是成员变量。

再举个更学术化点的例子,与非门:

class NotAndGate extends Object{ private $_key1; private $_key2; public function setKey1($value)$this->_key1 = $value; public function setKey2($value)$this->_key2 = $value; public function getOutput()!$this->_key2) return true; else if ($this->_key1 && $this->_key2) return false; }

与非门有两个输入,当两个输入都为真时,与非门的输出为假,否则,输出为真。上面的代码中,与非 门类有两个成员变量,$_key1和$_key2。但是有3个属性,表示2个输入的key1和key2,以及表示输出的output。

成员变量和属性的区别与联系在于:

成员变量是一个“内”概念,反映的是类的结构构成。属性是一个“外”概念,反映的是类的逻辑意义。

成员变量没有读写权限控制,而属性可以指定为只读或只写,或可读可写。

成员变量不对读出作任何后处理,不对写入作任何预处理,而属性则可以。

public成员变量可以视为一个可读可写、没有任何预处理或后处理的属性。 而private成员变量由于外部不可见,与属性“外”的特性不相符,所以不能视为属性。

虽然大多数情况下,属性会由某个或某些成员变量来表示,但属性与成员变量没有必然的对应关系, 比如与非门的output属性,就没有一个所谓的$output成员变量与之对应。

在Yii中,由yii\base\Object提供了对属性的支持,因此,如果要使你的类支持属性, 必须继承自yii\base\Object。Yii中属性是通过PHP的魔法函数__get()__set()来产生作用的。 下面的代码是yii\base\Object类对于__get()和__set()的定义:

public function __get($name) // 这里$name是属性名 { $getter = 'get' . $name; // getter函数的函数名 if (method_exists($this, $getter)) return $this->$getter(); // 调用了getter函数 elseif (method_exists($this, 'set' . $name)) throw new InvalidCallException('Getting write-only property: ' . get_class($this) . '::' . $name); else throw new UnknownPropertyException('Getting unknown property: ' . get_class($this) . '::' . $name); } // $name是属性名,$value是拟写入的属性值 public function __set($name, $value) { $setter = 'set' . $name; // setter函数的函数名 if (method_exists($this, $setter)) $this->$setter($value); // 调用setter函数 elseif (method_exists($this, 'get' . $name)) throw new InvalidCallException('Setting read-only property: ' . get_class($this) . '::' . $name); else throw new UnknownPropertyException('Setting unknown property: ' . get_class($this) . '::' . $name); }
实现属性的步骤

我们知道,在读取和写入对象的一个不存在的成员变量时,__get()__set()会被自动调用。 Yii正是利用这点,提供对属性的支持的。从上面的代码中,可以看出,如果访问一个对象的某个属性, Yii会调用名为get属性名()的函数。如,SomeObject->Foo, 会自动调用SomeObject->getFoo()。如果修改某一属性,会调用相应的setter函数。 如,SomeObject->Foo=$someValue,会自动调用SomeObject->setFoo($someValue)。

因此,要实现属性,通常有三个步骤:

继承自yii\base\Object。

声明一个用于保存该属性的私有成员变量。

提供getter或setter函数,或两者都提供,用于访问、修改上面提到的私有成员变量。 如果只提供了getter,那么该属性为只读属性,只提供了setter,则为只写。

如下的Post类,实现了可读可写的属性title:

class Post extends yii\base\Object // 第一步:继承自 yii\base\Object { private $_title; // 第二步:声明一个私有成员变量 public function getTitle() // 第三步:提供getter和setter return $this->_title; public function setTitle($value) $this->_title = trim($value); }

从理论上来讲,将private$_title写成public$title,也是可以实现对$post->title的读写的。但这不是好的习惯,理由如下:

失去了类的封装性。 一般而言,成员变量对外不可见是比较好的编程习惯。 从这里你也许没看出来,但是假如有一天,你不想让用户修改标题了,你怎么改? 怎么确保代码中没有直接修改标题? 如果提供了setter,只要把setter删掉,那么一旦有没清理干净的对标题的写入,就会抛出异常。 而使用public$title的方法的话,你改成private$title可以排查写入的异常,但是读取的也被禁止了。

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:荆州SEO http://jingzhou.raoyu.net


  • 上一篇:最好的ASP.NET虚拟主机空间推荐
  • 下一篇:最后一页
  • 
    COPYRIGHT © 2015 长春市隆兴伟业物流有限公司 ALL RIGHTS RESERVED.
    本站所有原创信息,未经许可请勿任意转载或复制使用 网站地图 技术支持:肥猫科技
    精彩专题:网站建设
    购买本站友情链接、项目合作请联系客服QQ:2500-38-100