Yii2 理解Object

    • 版本
    • 继承与实现
    • 构造函数 __construct
    • __get __set
    • method_exists
    • __isset __unset
    • 其余判断函数

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
时间: 2024-09-10 09:12:28

Yii2 理解Object的相关文章

Yii2 理解filters

版本 ActionFilter AccessControl AccessRule VerbFilter 其它 1 版本 // yii\BaseYii\getVersion public static function getVersion() { return '2.0.10'; } 2 ActionFilter 动作过滤器的基类, 有两个重要的变量, 这两个变量都是存储action id $except: 过滤器将不会应用于在这里面出现的action,即使出现在$only中,过滤器也不会有效.

Yii2 理解di

链接 版本 简述 Container Instance TOP 示例说明 TOP 0 链接 http://alex-my.xyz/web/Yii2-理解di 1 版本 // yii\BaseYii\getVersion public static function getVersion() { return '2.0.10'; } 2 简述 简单的说就是di把类的构造函数分析好存储起来,配上给定的参数,创建实例. // 类名给定后通过php的反射机制获取构造函数信息 // set的第二个参数是构

Yii2 理解Component

版本 继承与实现 event和behaviors behaviors 添加Behavior到Component ensureBehaviors attachBehavior和attachBehaviors detachBehavior和detachBehaviors __get __set __call on和off 1 版本 // yii\BaseYii\getVersion public static function getVersion() { return '2.0.10'; } 2

Yii2 理解Validator

版本 Validator BooleanValidator CompareValidator DateValidator DefaultValueValidator EachValidator EmailValidator ExistValidator FileValidator FilterValidator ImageValidator IpValidator NumberValidator RangeValidator RegularExpressionValidator Required

Yii2 理解Controller

版本 继承与实现 actions createAction getModules runAction run findLayoutFile render renderContent 参考 1 版本 // yii\BaseYii\getVersion public static function getVersion() { return '2.0.10'; } 2 继承与实现 Controller继承与Component, 并实现了ViewContextInterface接口. 在Control

java Object.clone()的效果

调用Object.clone()时,实际发生的是什么事情呢?当我们在自己的类里覆盖clone()时,什么东西对于super.clone()来说是最关键的呢?根类中的clone()方法负责建立正确的存储容量,并通过"按位复制"将二进制位从原始对象中复制到新对象的存储空间.也就是说,它并不只是预留存储空间以及复制一个对象--实际需要调查出欲复制之对象的准确大小,然后复制那个对象.由于所有这些工作都是在由根类定义之clone()方法的内部代码中进行的(根类并不知道要从自己这里继承出去什么),

10招让你成为杰出的Java程序员(转)

  如果你是一个热衷于技术的 Java 程序员, 那么下面的 10 个要点可以让你在众多 Java 开发人员中脱颖而出. 1. 拥有扎实的基础和深刻理解 OO 原则 对于 Java 程序员,深刻理解 Object Oriented Programming(面向对象编程)这一概念是必须的.没有 OOPS 的坚实基础,就领会不了像 Java 这些面向对象编程语言的美.光学习 OO 原则的定义用处不大,关键是要学会如何应用这些原则用一种 OO 的方式去设计解决方案.因此,我们应该对对象建模.继承.多态

js创建对象的方法汇总_javascript技巧

js一个有三种方法创建对象,这里做一个总结. 1.对象直接量 所谓对象直接量,可以看做是一副映射表,这个方法也是最直接的一个方法,个人比较建议, //创建简单对象 var obj1 = {}; //空对象 var obj2 = { name: "ys", age: 12 }; //创建复杂对象 var obj3 = { name: "ys", age: 12, like: { drink: "water", eat: "food&quo

10 招让你成为杰出的Java程序员

如果你是一个热衷于技术的 Java 程序员, 那么下面的 10 个要点可以让你在众多 Java 开发人员中脱颖而出. 1. 拥有扎实的基础和深刻理解 OO 原则 对于 Java 程序员,深刻理解 Object Oriented Programming(面向对象编程)这一概念是必须的.没有 OOPS 的坚实基础,就领会不了像 Java 这些面向对象编程语言的美.光学习 OO 原则的定义用处不大,关键是要学会如何应用这些原则用一种 OO 的方式去设计解决方案.因此,我们应该对对象建模.继承.多态.设