学习yii2.0框架阅读代码(九)

vendor/yiisoft/yii2/base/Model.php(完)

    /**
     * 该方法将验证每一个模型,可以验证多个模型.
     * be of the same or different types.
     * @param array $models the models to be validated
     * @param array $attributeNames list of attribute names that should be validated.
     * 如果该参数为空,这意味着任何属性中列出的适用
     * 需要验证规则
     * @return 判断所有的模型是有效的。如果一个错误将返回false
     */
    public static function validateMultiple($models, $attributeNames = null)
    {
        $valid = true;
        /* @var $model Model */
        foreach ($models as $model) {
            $valid = $model->validate($attributeNames) && $valid;
        }

        return $valid;
    }

    /**
     * 当没有指定特定的字段,返回的字段列表应该返回默认的[[toArray()]]
     * 此方法应该返回一个数组字段名和定义的字段
     * 如果是前者,字段名称将被视为一个对象属性名称的值将被使用
     * 如果是后者,数组的键应该是在数组的值应该是字段名
     * 相应的字段定义可以是一个对象的属性名或一个PHP调用
     *
     * ```php
     * function ($field, $model) {
     *     // return field value
     * }
     * ```
     *
     * 例如,下面的代码声明四个属性:
     * ```php
     * return [
     *     ‘email‘,
     *     ‘firstName‘ => ‘first_name‘,
     *     ‘lastName‘ => ‘last_name‘,
     *     ‘fullName‘ => function ($model) {
     *         return $model->first_name . ‘ ‘ . $model->last_name;
     *     },
     * ];
     * 这个方法返回的默认实现[[attributes()]]相同的属性名
     * @return 数组列表字段名和定义的字段.
     * @see toArray()
     */
    public function fields()
    {
        $fields = $this->attributes();
        // array_combine — 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值
        return array_combine($fields, $fields);
    }

    /**
     * 返回一个迭代器遍历属性的模型.
     * 该方法需要一个IteratorAggregate接口.
     * @return ArrayIterator迭代器遍历列表中的项目.
     */
    public function getIterator()
    {
        // 获取该 model 的所有属性
        $attributes = $this->getAttributes();
        // ArrayIterator 这个迭代器允许在遍历数组和对象时删除和更新值与键
        // 当你想多次遍历相同数组时你需要实例化 ArrayObject,然后让这个实例创建一个 ArrayIteratror 实例, 然后使用 foreach 或者 手动调用 getIterator() 方法
        return new ArrayIterator($attributes);
    }

    /**
     * 返回是否有指定偏移位置的一个元素.
     * 该方法所需的SPL ArrayAccess接口
     * It is implicitly called when you use something like `isset($model[$offset])`.
     * @param mixed $offset the offset to check on
     * @return boolean
     */
    public function offsetExists($offset)
    {
        // 将 isset($model[$offset]) 重写为 isset($model->$offset)
        return $this->$offset !== null;
    }

    /**
     * 返回指定偏移位置的元素.
     * 该方法所需的SPL ArrayAccess接口
     * It is implicitly called when you use something like `$value = $model[$offset];`.
     * @param mixed $offset the offset to retrieve element.
     * @return mixed the element at the offset, null if no element is found at the offset
     */
    public function offsetGet($offset)
    {
        // 将获取 $model[$offset] 重写为 $model->$offset
        return $this->$offset;
    }

    /**
     * offset设置指定偏移位置的元素
     * @param integer $offset the offset to set element
     * @param mixed $item the element value
     */
    public function offsetSet($offset, $item)
    {
        // 将 $model[$offset] = $item 重写为 $model->$offset = $item
        $this->$offset = $item;
    }

    /**
     * 设置指定偏移位置的元素值为null.
     * 该方法所需的SPL ArrayAccess接口
     * @param mixed $offset the offset to unset element
     */
    public function offsetUnset($offset)
    {
        // 将 unset($model[$offset]) 重写为 $model->$offset = null
        $this->$offset = null;
    }
}
时间: 2024-10-25 16:45:06

学习yii2.0框架阅读代码(九)的相关文章

学习yii2.0框架阅读代码(十九)

vendor/yiisoft/yii2/base/Module. php(续) /** * 检索指定的子模块ID. * 这种方法支持检索两个子模块和子模块. * @param string $id module ID (case-sensitive). To retrieve grand child modules, * use ID path relative to this module (e.g. `admin/content`). * @param boolean $load wheth

学习yii2.0框架阅读代码(四)

阅读 BaseYii Yii的辅助类核心框架 别名相关(续) //用一个真实的路径注册一个别名 public static function setAlias($alias, $path) { if (strncmp($alias, '@', 1)) { // 如果不是以 @ 开头,就将 @ 拼到开头 $alias = '@' . $alias; } // 获取 / 在 $alias 中首次出现的位置 $pos = strpos($alias, '/'); // 如果 / 不存在,$root 就

学习yii2.0框架阅读代码(十七)

vendor/yiisoft/yii2/base/Module. 模块类 每个模块都有一个继承yii\base\Module的模块类,该类文件直接放在模块的yii\base\Module::basePath目录下, 并且能被自动加载.当一个模块被访问,和应用主题实例类似会创建该模块类唯一实例,模块实例用来帮模块内代码共享数据和组件 class Module extends ServiceLocator { /** * @event 在执行ActionEvent方法时触发事件 * 你可以设置[[A

学习yii2.0框架阅读代码(三)

阅读 BaseYii Yii的辅助类核心框架 别名相关 <?php namespace yii; //定义命名空间,昨天修改了一天.. use yii\base\InvalidConfigException; use yii\base\InvalidParamException; use yii\base\UnknownClassException; use yii\log\Logger; use yii\di\Container; //获取应用程序开始时间 defined('YII_BEGIN

学习yii2.0框架阅读代码(十一)

vendor/yiisoft/yii2/base/Module. php(续) /** * 该方法解析指定的路线和创建相应的子模块(s),控制器和行动 * This method parses the specified route and creates the corresponding child module(s), controller and action * instances. It then calls [[Controller::runAction()]] to run th

学习yii2.0框架阅读代码(十五)

行为是 yii\base\Behavior 或其子类的实例.行为,也称为mixins,可以无须改变类继承关系即可增强一个已有的 yii\base\Component 类功能.当行为附加到组件后,它将“注入”它的方法和属性到组件,然后可以像访问组件内定义的方法和属性一样访问它们.此外,行为通过组件能响应被触发的事件,从而自定义或调整组件正常执行的代码. <?php namespace yii\base; /** * 行为是所有行为类的基类. * * 一个行为可以用来增强现有的功能组件,无需修改其代

学习yii2.0框架阅读代码(七)

vendor/yiisoft/yii2/base/Model.php <?php /** * @link http://www.yiiframework.com/ * @copyright Copyright (c) 2008 Yii Software LLC * @license http://www.yiiframework.com/license/ */ namespace yii\base; use Yii; use ArrayAccess; use ArrayObject; use A

学习yii2.0框架阅读代码(六)

vendor/yiisoft/yii2/base/ArrayableTrait. <?php /** * @link http://www.yiiframework.com/ * @copyright Copyright (c) 2008 Yii Software LLC * @license http://www.yiiframework.com/license/ */ namespace yii\base; use Yii; use yii\helpers\ArrayHelper; use

学习yii2.0框架阅读代码(二十)

vendor/yiisoft/yii2/base/Module. php(续) /** * 新建一个控制器实例基于给定的路线. * * 路线应该是相对于这个模块.该方法实现了以下算法 * to resolve the given route: * * 1. If the route is empty, use [[defaultRoute]]; * 2. If the first segment of the route is a valid module ID as declared in [