## 创建数据对象:data()方法 #### 1. 功能:给模型对象$data赋值,将模型对象转为数据对象 >[info] 模型对象与数据对象,之间就差一个赋过值$data; #### 2. 方法:data()其源代码如下: >[info] 本教程如无特别说明:源码均指:Model.php 类文件中的内容。 文件位置:/thinkphp/library/think/Model.php * 备注:注释为作者另加,源码中并没有 ~~~ /** * 设置数据对象值 * @access public * @param mixed $data 数据或者属性名 * @param mixed $value 值 * @return $this */ public function data($data, $value = null) //$value可不传,不给时取默认值 { if (is_string($data)) { //如何$data是字符串,则视为$data数组的键名 $this->data[$data] = $value; //给当前类data[$data键名]赋值:$value } else { // 清空数据 $this->data = []; if (is_object($data)) { //如参数$data是对象,将$data对象属性转关联数组给当前类的$data[]赋值 //注意:外部调用,仅限公共非静态属性可以转为关联数组 $data = get_object_vars($data); //对象属性转关联数组 } if (true === $value) { //第二个参数是布尔值true:1,用获取器方法给$data[]赋值 // 数据对象赋值 foreach ($data as $key => $value) { $this->setAttr($key, $value, $data); } } else { //将$data数组参数,直接绑定到到类的data[]属性上,完成初始化 $this->data = $data; } } return $this; //返回数据对象 } ~~~ #### 3. 参数与返回值 * 分析源码可看出,data()方法支持三类参数: | 序号 | 参数 | 说明 | | --- | --- | --- | | 1 | $string / 字符串 | 必须存在第2个参数,第一个是键名,第二个是值,用于给数据对象中$data属性数据元素逐个赋值 | | 2 | $array / 数组 | 用于给对象中的$data属性批量赋值 | | 3 | $object / 对象 | 将对象转关联数组后,批量给$data属性赋值 | * 返回值:数据对象 #### 4. 实例演示:模型对象中$data属性赋值 >[info] Staff模型类创建与前面一样的,目前我们使用一个空的模型类就可以完成测试 * 自定义模型类: Staff.php ~~~ <?php namespace app\index\model; //导入模型类 use think\model; class Staff extends model { //自定义模型类代码 } ~~~ 1. 逐个赋值:用双字符串参数实现 >[info] 第1个字符串是数组元素的键名,第2个是数组元素的值。 * 通过data方法的重复调用来实现对模型对象$data属性的逐个赋值 * 控制器:Index.php ~~~ <?php namespace app\index\controller; //导入模型类 use app\index\model\Staff; class Index { public function index(){ //1.创建模型对象$model $model = new Staff(); //2.重复调用模型对象的data()方法,完成对该对象属性$data的赋值 //赋值成功,则完成模型对象向数据对象的转换 $model -> data('id','10'); //$data['id'] = 10 $model -> data('name','Peter'); //$data['name'] = 'Peter' $model -> data('age',30); //$data['age'] = 30 //3.查看获取到了原始数据的模型对象 dump($model); } } ~~~ * 浏览器查看结果: tp5.com/index.php/index/index > tp5.com 是我们之前配置好的一个本地域名 ~~~ object(app\index\model\Staff)#5 (28) { //这里略去与本例无关的属性 ······ ["data":protected] => array(3) { ["id"] => string(2) "10" ["name"] => string(5) "Peter" ["age"] => int(30) } //这里略去与本例无关的属性 ······ } ~~~ * * * * * 2. 批量赋值:用数组实现 >[info] 我们在代码中的$data是创建的用来赋值的数组,是数据对象的数据源,注意二者区别 * 控制器:Index.php : ~~~ <?php namespace app\index\controller; //导入模型类 use app\index\model\Staff; class Index { public function index(){ //1.创建模型对象$model $model = new Staff(); //2.创建数组$data,用作数据对象数据源 $data = []; $data['id'] = 1010; $data['name'] = 'Peter'; $data['age'] = 50; //3.调用模型对象data方法,将$data数组赋值该对象的$data属性 //完成数据对象的创建 $model -> data($data); //3.查看对象 dump($model); } } ~~~ >[warning] 特别提示:数组来实例化模型对象,无法实现逐个赋值。它的每一次操作,都是对模型对象$data属性的整体赋值。 * * * * * 3. 用对象来实例化模型对象 * 控制器代码:Index.php : ~~~ <?php namespace app\index\controller; //导入模型类 use app\index\model\Staff; class Index { public function index(){ //1.创建模型对象$model $model = new Staff(); //2.创建标准(通用)对象 $data $data = new \stdClass; //3.给标准对象$data添加属性 $data -> id = 1001; $data -> name = 'ThinkPHP5'; //4.调用模型对象data方法,将$data对象的属性逐个赋值给该对象$data属性 //完成数据对象的创建 $model -> data($data); //3.查看对象 dump($model); } } ~~~ * 浏览器查看结果: tp5.com/index.php/index/index > tp5.com 是我们之前配置好的一个本地域名 ~~~ object(app\index\model\Staff)#5 (28) { //这里略去与本例无关的属性 ······ ["data":protected] => array(2) { ["id"] => string(2) "1001" ["name"] => string(5) "ThinkPHP5" } //这里略去与本例无关的属性 ······ } ~~~ >[warning] 用对象来实例化创建数据对象,即可以逐个赋值,也可以整体赋值,非常灵活 * * * * * #### 5. 总结: >[success] data()方法创建数据对象,非常直观和高效,特别是对象参数,显得更加的高级和优雅,与其它优秀框架非常相似。data方法的三种参数,重点掌握:【数组】