博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Yii2 提供可以用属性的方式去获取类的一个方法
阅读量:6156 次
发布时间:2019-06-21

本文共 1967 字,大约阅读时间需要 6 分钟。

刚开始用 Yii 的小朋友可能对下面的写法非常疑惑:

public function actionIndex(){    $user = User::find()->where(['name'=>'zhangsan'])->one();    $user->orders; // 关联查询订单表}

去 User 的 Model 去找 orders 属性也没找到,这个是什么实现的?为什么可以这样写?

其实这个只是 PHP 魔术方法的__get的一种实现。

为了更高的访问了我们的数据,Yii2 提供了可以用属性的方式去获取类的一个方法,Demo如下:

// User Modelpublic function getOrders(){    return $this->hasMany(Order::className(), ['user_id' => 'id']);}//  User Controllerpublic function actionView($id){    $user = User::find()->where(['name'=>'zhangsan'])->one();    $user->orders; //  此处访问的就是 getOrders() 方法}

追溯到源代码(yii2\base\Component.php):

/** * Returns the value of a component property. * This method will check in the following order and act accordingly: * *  - a property defined by a getter: return the getter result *  - a property of a behavior: return the behavior property value * * Do not call this method directly as it is a PHP magic method that * will be implicitly called when executing `$value = $component->property;`. * @param string $name the property name * @return mixed the property value or the value of a behavior's property * @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)) {        // read property, e.g. getName()        return $this->$getter();    } else {        // behavior property        $this->ensureBehaviors();        foreach ($this->_behaviors as $behavior) {            if ($behavior->canGetProperty($name)) {                return $behavior->$name;            }        }    }    if (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);    }}

 

转载于:https://www.cnblogs.com/yhdsir/p/5181675.html

你可能感兴趣的文章
cannot run programing "db2"
查看>>
mysql做主从relay-log问题
查看>>
Docker镜像与容器命令
查看>>
批量删除oracle中以相同类型字母开头的表
查看>>
Java基础学习总结(4)——对象转型
查看>>
BZOJ3239Discrete Logging——BSGS
查看>>
SpringMVC权限管理
查看>>
spring 整合 redis 配置
查看>>
cacti分组发飞信模块开发
查看>>
浅析LUA中游戏脚本语言之魔兽世界
查看>>
飞翔的秘密
查看>>
Red Hat 安装源包出错 Package xxx.rpm is not signed
查看>>
编译安装mysql-5.6.16.tar.gz
查看>>
活在当下
查看>>
每天进步一点----- MediaPlayer
查看>>
PowerDesigner中CDM和PDM如何定义外键关系
查看>>
跨域-学习笔记
查看>>
the assignment of reading paper
查看>>
android apk 逆向中常用工具一览
查看>>
MyEclipse 报错 Errors running builder 'JavaScript Validator' on project......
查看>>