## 创建数据对象之:setAttr方法 #### 1. 作用:如果数据对象中已存在指定数据,则更新;如果不存在,则创建。 >[info] setAttr()方法也叫修改器 #### 2. setAttr()源码: >[info] 本教程如无特别说明:源码均指:Model.php 类文件中的内容。 文件位置:/thinkphp/library/think/Model.php ~~~ /** * 修改器 设置数据对象值 * @access public * @param string $name 属性名 * @param mixed $value 属性值 * @param array $data 数据 * @return $this */ public function setAttr($name, $value, $data = []) { if (is_null($value) && $this->autoWriteTimestamp && in_array($name, [$this->createTime, $this->updateTime])) { // 自动写入的时间戳字段 $value = $this->autoWriteTimestamp($name); } else { // 检测修改器 $method = 'set' . Loader::parseName($name, 1) . 'Attr'; if (method_exists($this, $method)) { $value = $this->$method($value, array_merge($data, $this->data)); } elseif (isset($this->type[$name])) { // 类型转换 $value = $this->writeTransform($value, $this->type[$name]); } } // 标记字段更改 if (!isset($this->data[$name]) || ($this->data[$name] != $value && !in_array($name, $this->change))) { $this->change[] = $name; } // 设置数据对象属性 $this->data[$name] = $value; return $this; } ~~~ * * * * * #### 3. 参数与返回值 * 参数: | 序号 | 参数 | 说明 | | --- | --- | --- | | 1 | $name/ 字符串 | 数据对象$data[ ]的数组元素的键名 | | 2 | $value / 复合类型 | 数据对象$data[ ]的数组元素的值 | | 3 | $data=[ ] / 数组 | 数据对象$data,通常不需要传入,保持默认即可 | * 返回值:数据对象 * * * * * #### 4. 实例演示 1. 任务:给模型对象逐个赋值,创建数据对象 >[info] Staff模型类创建与前面一样的,目前我们使用一个空的模型类就可以完成测试 * 自定义模型类: Staff.php ~~~ <?php namespace app\index\model; //导入模型类 use think\model; class Staff extends model { //自定义模型类代码 } ~~~ * 控制器Index.php: ~~~ <?php namespace app\index\controller; //导入模型类 use app\index\model\Staff; class Index { public function index(){ //1.创建模型对象$model $model = new Staff(); //2.setAttr()方法操作数据对象 //如果该属性不存在,则创建该属性 //如果该属性已存在,则更新该属性 $model -> setAttr('id',10); $model -> setAttr('name','Jack'); $model -> setAttr('age',20); //3.查看该数据对象 dump($model); } } ~~~ * 浏览器查看结果: tp5.com/index.php/index/index > tp5.com 是我们之前配置好的一个本地域名 ~~~ object(app\index\model\Staff)#5 (28) { //这里略去与本例无关的属性 ······ ["data":protected] => array(3) { ["id"] => int(10) ["name"] => string(4) "Jack" ["age"] => int(20) } //这里略去与本例无关的属性 ······ } ~~~ #### 5. 总结: >[success] setAttr( )方法,实际开发中并不常用,但我们在Model类源码中,却随处可见他的身影。该方法不仅可以创建数据对象,还可以更新数据对象。但是该方法只能一个个逐个处理数据,多个数据需要同时处理,就必须多次调用才可以实现。