1. 程式人生 > >PHP 小技巧之__callStatic魔術方法使用

PHP 小技巧之__callStatic魔術方法使用

 

 

使用 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);