设为首页 加入收藏

TOP

Yii2的深入学习--yii\base\Object 类(一)
2017-10-10 09:51:03 】 浏览:5082
Tags:Yii2 深入 学习 --yiibaseObject

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

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

<?php
namespace yii\base;

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)
    {
        ...
    }
}

如果想看详细的注释的话,可以访问 https://github.com/ReadCode/yii2-2.0.3-annotated/blob/master/framework/base/Object.php

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

    /**
     * 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
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇使用正则实现php的trim函数,支持.. 下一篇又是周六了-MySQL特训

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目