【ThinkPHP】ThinkPHP5 讀取器、修改器、型別轉換、自動完成
阿新 • • 發佈:2018-12-16
讀取器
命名規範:get + 屬性名的駝峰命名 + Attr
程式在讀取屬性時,自動檢測是否存在讀取器方法
修改器(寫入器)
命名規範:set + 屬性名的駝峰命名 + Attr
自動型別轉換
配置自動型別轉換後,程式會在讀取或者寫入資料時,自動對資料進行型別轉換
型別 | 描述 |
---|---|
integer | 整型 |
float | 浮點型 |
array | 陣列 |
json | JSON型別 |
object | 物件 |
datetime | 日期時間 |
timestamp | 時間戳(整型) |
serialize | 序列化 |
自動完成
自動完成可以在插入或者更新資料時指定某個欄位值
也可以結合修改器來指定自動完成
Index.php(控制器檔案)
<?php
namespace app\index\controller;
use app\index\model\User;
class Index extends Controler {
public function index {
$user = User::get(1);
/**** 讀取器 ****/
echo $user -> nickname . '<br />'; // 自動檢測 getNicknameAttr讀取器方法
echo $user -> email . '<br />' ; // 自動檢測 getEmailAttr讀取器方法
echo $user -> reg_time . '<br />'; // 自動檢測 getRegTimeAttr讀取器方法
// 資料庫儲存的reg_time為1507564800,經過getRegTimeAttr讀取器方法修改以後輸出結果為2017-10-10
// 若檢測到讀取器,輸出經過讀取器改變後的值。若無讀取器,值原樣返回。
/**** 修改器 ****/
$user -> reg_time = '2017-10-10'; //自動檢測 setRegTimeAttr修改器方法
$user -> save ();
/**** 自動型別轉換 ****/
echo $user -> reg_time;
$user -> nickname = ['aa' => 11];
// 陣列['aa' => 11]序列化為字串'a:1:{s:2:\"aa\";i:11;}'
$user -> save();
print_r($user -> nickname);
// 字串'a:1:{s:2:\"aa\";i:11;}'反序列化為陣列Array([aa] => 11)
/**** 自動完成 ****/
User::create(['nackname'] => 'helloword'); // 插入一條新資料,自動完成 insert
$user -> sex = 1; // 雖然賦值為1,但因為update自動完成,sex無法寫死,值會根據sex修改器自動更改
}
}
User.php(模型檔案)
<?php
namespace app\index\model;
use think\Model;
class User extends Model {
/**** 讀取器 ****/
// RegTime讀取器
protected function getRegTimeAttr($regtime) {
return 'old time:'.date('Y-m-d', $regtime); // 時間戳格式改為Y-m-d格式
}
// Email讀取器
protected function getEmailAttr($a, $user) { // 第二個引數為整個資料物件,命名無要求
return "your Email:$a, and your password:{$user['password']}";
}
/**** 修改器 ****/
// RegTime修改器
protected function setRegTimeAttr($regtime) {
return strtotime($regtime); //strtotime()函式將任何英文文字的日期或時間描述解析為 Unix 時間戳
}
/**** 自動型別轉換 ****/
protected $type = array(
'reg_time' => 'timestamp:Y-m-d',
// 告訴程式,reg_time是時間戳日期型別,並且指定轉換格式為Y-m-d
'nickname' => 'serialize',
// 將變數序列化為可儲存的字串,例如資料庫nickname欄位是不能儲存陣列的,將陣列序列化為字串存入欄位,讀取的時候自動將字串反序列化為陣列
);
/**** 自動完成 ****/
// 自動完成 insert(插入資料時) update(更新資料時) auto(insert和update時)
protected $insert = array(
'set_time' => time(),//插入資料時,自動新增set_time值為當前時間
);
// 自動完成 值不寫死
protected $update = array(
'sex',//告訴系統sex欄位自動完成,但值不寫死
);
// sex修改器
protected function setSexAttr($sex, $user) {
return $user['head_pic'] == 'boy.jpg' ? 1 : 0;
// head_pic欄位的值若為boy.jpg則返回1,否則返回0
}
}
用途
讀取器
主要用於讀取資料輸出顯示,如資料表地址欄位為省、市、區儲存為id格式,顯示需要省市區標準的地址格式,可在讀取器中先進行修改拼接,再返回輸出。
修改器
主要用於更新資料、插入資料,如使用者提交出生年月日格式為Y-m-d,資料表儲存的是unix時間戳int格式,則需要在修改器中將時間資料格式修改後返回提交。
自動型別轉換
主要用於資料型別轉換,如時間格式、整型浮點數格式等。
自動完成
主要用於對一些使用者不可輸入的資料進行更改新增,如註冊時間、修改日期、預設頭像等。