## 創建數據對象: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方法的三種參數,重點掌握:【數組】
- 前言[隨時更新]
- 開發環境
- 1.Mac環境
- 2.windows環境
- 模型對象
- 1.創建模型對象
- 2.模型初始化
- 數據對象
- 1.定義數據對象
- 2.創建數據對象
- 1.data方法
- 2.setAttr方法
- 3.__set方法
- 4.查詢數據對象
- 1.getData方法
- 2.getAttr方法
- 3.__get方法
- OOP難點總結
- 1.get_class( )實例講解
- 2.get_called_class( )實例講解
- 3.__call( )實例講解
- 3.__callStatic( )實例講解
- 4.call_user_func_array函數[重點]
- 5.普通方法與靜態方法
- 6.在Model源碼中的應用
- 7.new static 延遲靜態綁定
- PHP標準化規范
- 查詢數據
- 1.獲取單條:get靜態方法
- 2.獲取單條:對象查詢
- 3.獲取多條:all靜態方法
- 4.獲取多條:對象查詢
- 5.獲取字段值:value方法
- 6.獲取列值:column方法
- 7.動態查詢:getBy字段名
- 8.助手函數:model查詢
- 9.加載器:Loader類查詢
- 10.數據庫與模型查詢對比
- 新增數據
- 1.sava方法
- 2.savaAll方法
- 3.create靜態方法
- 4.insert靜態調用
- 更新數據
- 1.單條更新:save方法
- 2.批量更新:saveAll方法
- 3.靜態更新:update方法
- 4.查詢類Query直接更新
- 5. 閉包更新
- 刪除數據
- 1.刪除當前記錄:delete
- 2.靜態條件刪除:destory
- 獲取器
- 1.模型方法:set屬性Attr
- 修改器
- 1.set屬性Attr
- 時間戳
- 1.MySQL中日期類型復習
- 2.時間戳功能詳解
- 軟刪除[重點]
- 1.traits詳解[選學內容]
- 2.SoftDelet類源碼分析
- 3. delete實例刪除
- 4.destroy條件刪除
- 5.restore恢復數據
- 類型轉換
- 1. 規則設置
- 2. 實例演示
- 查詢范圍
- 1. 基本概念
- 2.實例演示