## __set( )方法自动创建数据对象原始数据 >[info] 其实就是通过魔术方法动态创建属性的方法来生成数据对象 #### 2. 源码: >[info] 本教程如无特别说明:源码均指:Model.php 类文件中的内容。 文件位置:/thinkphp/library/think/Model.php ~~~ /** * 修改器 设置数据对象的值 * @access public * @param string $name 名称 * @param mixed $value 值 * @return void */ public function __set($name, $value) //魔术方法来动态设置数据对象$data[] { $this->setAttr($name, $value); //键值对方式写入 } ~~~ >[info] 看了源码,发现了一个熟悉的身影:setAttr( )方法,你猜对了,这个方法在内部就是通过setAttr方法来给$data属性赋值,来完成数据对象的创建。 * 小常识:魔术方法: >[info] PHP面向对象编程中,如果外部访问对象中一个不存在的属性或方法时, 为了避免访问错误而定义的一组方法:魔术方法。 #### 3. 参数所返回值: * 参数: | 序号 | 参数 | 说明 | | --- | --- | --- | | 1 | $name / string 字符串 | 数据对象中$data属性数组元素的键名 | | 2 | $value / mixed 复合类型 | 数据对象中$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.__set()方法创建数据对象 $model -> id = 50; $model -> name = 'Tom'; $model -> age = 18; //3.查看该数据对象 dump($model); } } ~~~ >[success] Index.php 代码中并没有出现 __set() 方法,不要感到奇怪,因为魔术方法是自动调用用。 > 在本例中,我们给模型对象$model添加了三个属性,其类内部的__set()方法,将会自动添加到类属性$data数组中,完成数据对象的创建。 * 浏览器查看结果: tp5.com/index.php/index/index > tp5.com 是我们之前配置好的一个本地域名 ~~~ object(app\index\model\Staff)#5 (28) { //这里略去与本例无关的属性 ······ ["data":protected] => array(3) { ["id"] => int(50) ["name"] => string(3) "Tom" ["age"] => int(18) } //这里略去与本例无关的属性 ······ } ~~~ #### 5. 总结: >[success] 用魔术方法给模型对象初始化,来创建数据对象,实际开发中经常用到。特别是在CURD操作中,这种方式,符合ORM(对象关系映射),直观高效!请同学们尽快的熟悉这种语法方式。