Yii2 理解Object

简介: 版本继承与实现构造函数 __construct__get __setmethod_exists__isset __unset其余判断函数1 版本// yii\BaseYii\getVersionpublic static function getVersion(){ return '2.0.10';}2 继

1 版本

// yii\BaseYii\getVersion
public static function getVersion()
{
    return '2.0.10';
}

2 继承与实现

Object实现了Configurable接口。
Configureable要求在构造函数的参数末尾加上$config

public function __constructor($param1, $param2, ..., $config = [])

3 构造函数 __construct

// 按照Configureable要求, 需要在参数末尾添加 $config = []
public function __construct($config = [])
{
    if (!empty($config)) {
        Yii::configure($this, $config);
    }
    // 调用了初始化函数
    $this->init();
}

4 __get, __set

// 重写了php5中预定义的__get
// php5中的代码:
public function __get($name)
{ 
    return $this->$name; 
} 
// yii中的代码
public function __get($name)
{
    // 由原来的直接调用属性改为通过调用get函数来间接调用
    $getter = 'get' . $name;
    if (method_exists($this, $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);
    }
}

同理于__set
在代码中可以看见,如果找不到$getter, 却找到了setter, 就会报出异常,这个属性不可读。

5 method_exists

用于检测类中指定的函数是否存在

6 __isset, __unset

__isset 用于判断某个属性是否定义了
__unset 用于将某个属性设置为null,但是对只读的属性,会报异常

最好不要直接使用__isset和__unset,而是使用isset和unset

public function __isset($name)
{
    $getter = 'get' . $name;
    if (method_exists($this, $getter)) 
    {
        return $this->$getter() !== null;
    } 
    else 
    {
        return false;
    }
}
public function __unset($name)
{
    $setter = 'set' . $name;
    if (method_exists($this, $setter)) 
    {
        $this->$setter(null);
    } 
    elseif (method_exists($this, 'get' . $name)) 
    {
        throw new InvalidCallException('Unsetting read-only property: ' . get_class($this) . '::' . $name);
    }
}

7 其余判断函数

以下函数基本上借助于method_exists和property_exists

hasProperty
canGetProperty
canSetProperty
hasMethod
相关文章
|
10天前
|
存储 JavaScript
JS中Map对象与object的区别
JS中Map对象与object的区别
|
10天前
|
JavaScript
【Object.defineProperty() | new Proxy()】操作Object
【Object.defineProperty() | new Proxy()】操作Object
|
10月前
|
PHP
thinkphp报错Call to undefined method app\index\controller\Index::fetch()
thinkphp报错Call to undefined method app\index\controller\Index::fetch()
102 0
|
数据库
yii2.0的Class yii\widgets\LinkPager是干什么的?底层原理是什么?
yii2.0的Class yii\widgets\LinkPager是干什么的?底层原理是什么?
100 0
|
安全 API 开发工具
yii2.0的yii\authclient\Collection是干什么的?底层原理是什么?
yii2.0的yii\authclient\Collection是干什么的?底层原理是什么?
109 0
|
应用服务中间件 Apache nginx
YII2.0里面的'showScriptName' => false是干什么的?
YII2.0里面的'showScriptName' => false是干什么的?
118 0
|
缓存 开发框架 安全
Yii2是什么?
Yii2是什么?
249 0
|
Oracle 关系型数据库 MySQL
Yii2的基本要求是什么?
Yii2的基本要求是什么?
121 0
|
Web App开发 JavaScript 前端开发