PHP 小技巧之__callStatic魔術方法使用
阿新 • • 發佈:2018-11-09
使用 PHP 框架時,經常會用到 ORM 模型查詢資料庫,有沒有疑問:為啥有些 ORM 中的靜態查詢方法,不能通過函式追蹤下去呢,很有可能就是使用了 __callStatic 魔術方法的小技巧
這裡貼一個 簡單的 ORM 模型
1、先抽象一個基本操作demo類
2、資料表對應的模型配置: 對應資料表 和 資料表中的欄位
3、最後直接使用:
demo程式碼如下:
<?php /** * User: [email protected]* Date: 2018/11/9 * Time: 上午11:00 */ abstract class ActiveRecord { protected static $table; protected $fieldValues; public $select; function __get($fieldName) { return $this->fieldValues[$fieldName]; } static function __callStatic($methodName, $arguments) { // 正則向後引用提取欄位 $field = preg_replace("/^findBy(\w*)$/", '\\1', $methodName); // 條件欄位 $field 需要做大小寫轉換,甚至駝峰法還原欄位,這裡未做 $query = "select * from " . self::$table . " where " . $field . " = " . $arguments[0]; return self::createDomain($query); }private static function createDomain($query) { $class = get_called_class(); $domain = new $class; $domain->select = $query; $domain->fieldValues = []; //// 模擬查詢結果 $result = []; // TODO 可以在此步做駝峰法的轉換 foreach ($class::$fields as $index => $field) { $domain->fieldValues[$field] = $result[$field] ?? null; } return $domain; } } class Customer extends ActiveRecord { protected static $table = 'tb_customer'; protected static $fields = ['id', 'sex', 'name', 'age']; } class Goods extends ActiveRecord { protected static $table = 'tb_customer'; protected static $fields = ['id', 'title', 'describe']; } $customer = Customer::findByName('zhangsan'); $goods = Customer::findById(1); assert(true);
當然還能夠做一些方法的封裝,比如:
<?php /** * User: [email protected] * Date: 2018/11/9 * Time: 上午10:31 */ class LianShiDiaoYong { public static function __callStatic($methodName, $arguments) { switch ($methodName) { case 'strlen': case 'trim': $arg = $arguments[0]; break; case 'array_values': $arg = $arguments; } return call_user_func($methodName, $arg); } } $res = LianShiDiaoYong::strlen(' hello '); var_dump($res); $res = LianShiDiaoYong::trim(' hello '); var_dump($res); $res = LianShiDiaoYong::array_values('zhangsan', 'lisi'); var_dump($res);