1. 程式人生 > >【ThinkPHP】ThinkPHP5 讀取器、修改器、型別轉換、自動完成

【ThinkPHP】ThinkPHP5 讀取器、修改器、型別轉換、自動完成

讀取器

命名規範: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格式,則需要在修改器中將時間資料格式修改後返回提交。

自動型別轉換

主要用於資料型別轉換,如時間格式、整型浮點數格式等。

自動完成

主要用於對一些使用者不可輸入的資料進行更改新增,如註冊時間、修改日期、預設頭像等。