首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

ThinkPHP 模型自動完成實現 Session 值賦值:callback 回調與 function 函數區別詳解

     編輯:PHP 相關知識

ThinkPHP 模型自動完成實現 Session 值賦值:callback 回調與 function 函數區別詳解

ThinkPHP 模型的 _auto 自動完成機制支持在數據寫入前自動填充字段。本文演示如何在文章模型中自動完成 addtime(時間戳)與 username(Session 中的用戶名),並深度解析 function 與 callback 兩種調用模式的區別與適用場景。

一、完整模型代碼

<?php
class ArticleModel extends Model {
    // 自動完成定義:array(字段, 填充內容, 條件, 類型)
    protected $_auto = array(
        // 新增時自動填充時間戳
        array('addtime', 'time', 1, 'function'),

        // 新增時自動填充 Session 中的用戶名
        array('username', 'getName', 1, 'callback'),
    );

    // 回調方法:獲取 Session 值
    protected function getName() {
        return isset($_SESSION['name']) ? $_SESSION['name'] : '';
    }
}
?>

二、function vs callback 核心區別

類型參數值查找範圍適用場景示例
function函數名字符串Common/common.php 全局函數庫通用工具函數(如 time、md5、自定義 get_client_ip)array('addtime', 'time', 1, 'function')
callback方法名字符串當前模型類 的 protected/public 方法依賴模型上下文、需訪問 $this、Session、請求對象的業務邏輯array('username', 'getName', 1, 'callback')

三、自動完成條件參數(第3個參數)

  • 1:新增時(create() 且無主鍵值);
  • 2:更新時(create() 且有主鍵值);
  • 3:新增與更新均執行。

四、進階用法與避坑

  1. 填充內容支持函數調用: array('ip', 'get_client_ip', 1, 'function') 會調用 get_client_ip() 返回值填充;
  2. callback 方法可接收參數: 定義 protected function getName($data) { ... },$data 為當前要寫入的數據數組;
  3. Session 依賴: 確保入口文件已 session_start(),且 Session 鍵名一致;
  4. 避免在 callback 中再次 save: 會觸發遞歸自動完成,導致死循環或重複寫入;
  5. ThinkPHP 5/6 異同: TP5/6 棄用 _auto,改用 insert/update 事件或修改器 setAttr,邏輯相似但語法不同。

五、購物車 Session 存儲補充示例

<?php
class CartTool {
    private static $ins = null;
    private $items = [];

    // 單例模式
    final protected function __construct() {}
    final protected function __clone() {}
    public static function getIns() {
        return self::$ins ?: (self::$ins = new self());
    }

    // 綁定 Session
    public static function getCart() {
        if (!isset($_SESSION['cart']) || !($_SESSION['cart'] instanceof self)) {
            $_SESSION['cart'] = self::getIns();
        }
        return $_SESSION['cart'];
    }

    // 添加商品
    public function addItem($id, $name, $price, $brand, $thumb, $num = 1) {
        if ($this->hasItem($id)) {
            $this->incNum($id, $num);
            return;
        }
        $this->items[$id] = compact('id', 'name', 'price', 'brand', 'thumb', 'num');
        return $this->items[$id];
    }
    // ... incNum, modNum, delItem, getItems, getTotal 等方法
}
?>

六、總結

  • function 指向全局函數庫,callback 指向模型自身方法;
  • Session 值賦值必須用 callback,因需訪問 $_SESSION 且屬業務邏輯;
  • 自動完成條件(1/2/3)精確控制觸發時機;
  • 購物車等複雜業務建議封裝單例工具類,綁定 Session 持久化。

善用自動完成,能大幅減少控制器樣板代碼,保持模型職責清晰。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved