Yii2之属性

  一直以来,在我的理解中,类的成员变量和属性就是同一个东西,直到看了《深入理解Yii2.0才明白,

类的成员变量和属性其实不是同一个概念,成员变量是就类的结构构成而言的概念,而属性是就类的功能逻辑

而言的概念,而且两者没有必然的对应关系。

类的成员变量有public、protected、private三种类型,其中public类型的成员变量可以视为可读可写的属性,

而另外两种类型的成员变量都不是属性,因为属性应该是可以在类外面进行访问的。

在Yii2.0中,yii\base\Object类通过PHP的魔术方法__get()和__set()来提供对属性的支持,源码如下:

public function __get($name)
{
    $getter = ‘get‘ . $name;
    if (method_exists($this, $getter)) {//存在对应的getter方法
        return $this->$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);
    }
}
public function __set($name, $value)
{
    $setter = ‘set‘ . $name;
    if (method_exists($this, $setter)) {//存在对应的setter方法
        $this->$setter($value);
    } 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);
    }
}

  在yii2.0中,如果一个类需要支持属性,只要继承yii\base\Object类即可,以下举例说明:

class user extends yii\base\Object {
         public $name;
         private $addr;
         private $age;
         public function getAddress() {
                  return $this->addr;
         }
}

  这是一个很简单的类,根据类的成员变量和属性的概念可知,以上这个类中有三个成员变量:$name、$addr、

$age,两个属性:$name、address。其中$name是可读可写属性,而address是只读属性,因为只存在getter方法而没有

对应的setter方法。

  假如我们在user类外面创建一个对象$user,通过$user->address来读取user类的address属性的时候,其实是遍历了

一下user类的所有成员变量,没有找到address属性对应的成员变量的时候,再去调用__get()方法看看是否存在对应的

getter方法,有则调用它。可以看到,当类的某个属性没有对应的成员变量的时候,通过$user->address这种方式来访问

属性虽然比较方便但效率是比较低的,而使用$user->getAddress() 直接调用getter方法访问属性则可以省去遍历类成员

变量的过程,比较高效。

除了__get()和__set()之外,yii\base\Object类还提供了与属性相关的其他方法:

__isset():判断属性是否不为null。

__unset():将属性值设置为null。

hasProperty():判断是否存在某个属性。

canGetProperty():判断某个属性是否可读。

canSetProperty():判断某个属性是否可写。

在yii2.0中,创建一个对象的时候,怎么给对象的所有属性赋值呢?Yii2.0提供了一个统一的配置对象的方式,那

就是使用一个键值对形式的配置数组。那么yii2.0又是怎么支持这种配置方式的呢?通过查看源码可以看到,yii\base\Object

类的构造函数__construct()中调用了Yii::configure()方法,该方法源码如下:

public static function configure($object, $properties)
{
    foreach ($properties as $name => $value) {
        $object->$name = $value;
    }

    return $object;
}

  其实很简单,就是遍历配置数组,配置数组的键名为对象的属性名,对应的值则作为属性值,逐一进行赋值。至于当对象

的属性是对象或数组时,赋值操作该怎么进行就是setter函数的事了。

时间: 2024-10-15 02:29:34

Yii2之属性的相关文章

Yii2基本概念之——属性(property)

学习任何一门学问,往往都是从起基本的概念学起.万丈高楼平地起,这些基本概念就是高楼的基石,必须做详尽的分析.我们知道,Yii2是一款脉络清晰的框架,理顺了基础的概念和基本功能,学习更高级和复杂的功能就容易多了.Yii2是一款纯面向对象的框架,它对类的功能做了扩充:PHP类的功能分为属性和方法,而Yii2定义了类的三个功能:属性(property),行为(behavior)和事件(event). 为了更好的实现面向对象的编程,拿到一个现实的对象,要构造一个PHP对象与之对应,如果用Yii2框架去实

[moka同学笔记]Yii2.0给一张表中增加一个属性

1.model中建立关联 public function getUser(){ return$this->hasOne(User::className(),['id'=>'uid']) ; } 2.在视图中 <?= GridView::widget([ 'dataProvider' => $dataProvider, 'columns' => [ // ['class' => 'yii\grid\SerialColumn'], 取消掉编号 ['attribute'=&g

yii2布局选择与属性标签设置

Yii选择布局的方法: 1. 通过控制器成员变量设置: public $layout = false;//不使用布局 public $layout = 'main';//设置使用的布局文件(@app/views/layouts/main.php) 2. 通过控制器方法设置: $this->layout = false; $this->layout = 'main'; 3. 在视图文件中设置: $this->context->layout = false; $this->con

Yii2学习笔记:汉化yii,设置表单的描述(属性标签attributeLabels)

一:汉化框架 框架汉化在这里设置,如果不生效,前台后台的配置文件都设置下应该就可以了 二:汉化表单 汉化表单,直接在模型层设置,例如: 原来的联系我们表单 汉化后: ] 这种汉化在哪里修改呢?其实是设置属性标签,设置位置在模型层 代码如下 public function attributeLabels() { return [ 'name' => '称呼', 'email' => '邮箱', 'subject' => '标题', 'body' => '内容', 'verifyCod

Yii2.0 Gridview为某列增加属性

我们知道GridView组件非常方便,会自动生成数据表格.table tr td神马的全自动生成的.但是如果想定制化稍微有点难度. 比如想在某列td上应用样式. 老写法是这样的 <?= GridView::widget([ 'dataProvider' => $dataProvider, 'layout' => "{items}\n{pager}\n{summary}", 'summary' => '<p class="summary"

Yii2 DetailView添加html属性

DetailView用于展示一条记录所有字段信息,有时记录字段值可能是一个url,默认情况下显示的url字段是文本内容,而我们想在新的窗口中打开url查看信息,因此需要添加额外的html属性. 除了要添加format="url",还要添加target="_blank",这时format属性就要修改成format=['url',['target'=>'_blank']]

yii2.0中yii\base\Application的一些属性

必要属性 yii\base\Application::id 区分其他应用的唯一标识ID yii\base\Application::basePath 该应用的根目录 其他属性 yii\base\Application::aliases 定义多个别名,通常是方便路径,namespace的访问. yii\base\Application::bootstrap 指定应用启动阶段需要运行的组件. yii\web\Application::catchAll 指定一个要处理所有用户请求的 控制器方法,通常在

基于Yii2的医院信息管理系统的质量属性

软件质量的好坏,不仅要看系统是否满足客户的功能性要求,也要看其是否满足客户的非功能性要求,系统非功能性用质量属性来描述.在软件体系结构设计中,相关的系统质量属性有可用性.可修改性.性能.安全性.可测试性和易用性,所以基于yii的医院信息管理系统应该满足可用性.可修改性.性能.安全性.可测试性和易用性.下面就以这六个质量属性通过场景来分析系统的质量属性. 1.可用性分析: 可用性是指系统能够正常运行的时间比例.它常用两次故障之间的时间长度或出现故障时系统能够回复正常的速度来表示. 场景部分 值 刺

Yii2 文本框前加图标 input 添加属性的方法

<?= $form->field($model, 'username', [ 'inputTemplate' => '<div class="input-group"><span class="input-group-addon">@</span>{input}</div>', ])?> 添加属性的方法(注意inputOptions的使用): <?= $form->field($mo