使用 PHP 框架时,经常会用到 ORM 模型查询数据库,有没有疑问:为啥有些 ORM 中的静态查询方法,不能通过函数追踪下去呢,很有可能就是使用了 __callStatic 魔术方法的小技巧

这里贴一个 简单的 ORM 模型

1、先抽象一个基本操作demo类

2、数据表对应的模型配置: 对应数据表 和 数据表中的字段

3、最后直接使用:

demo代码如下:

<?php
/**
* User: szliugx@gmail.com
* 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: szliugx@gmail.com
* 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);

PHP 小技巧之__callStatic魔术方法使用的更多相关文章

  1. 懒人小技巧, Toad 常用偷懒方法

    用toad很久了, 感叹它的功能强大的同时整理了一些相关技巧,  有以前在网上看到的也有自己平时用的时候偶尔发现的, 分享一下, 它对用户体验方面做的真的很到位, 通过各种方式来方便用户的操作. 菜鸟 ...

  2. 20191125PHP抽象类、接口和魔术方法

    抽象类 不能被实例化,用于其他类的继承.使用abstract(抽象).抽象方法一定是抽象类,抽象类不一定有抽象方法. 接口interface是特殊的抽象类. eg: <?php //抽象类 ab ...

  3. PHP中的常用魔术方法

    魔术方法: 是指某些情况下,会自动调用的方法,称为魔术方法 php面向对象中,提供了这几个魔术方法,他们的特点都是 以双下划线__开头的 __construct()  构造方法 __destruct( ...

  4. PHP:__get()、__set()、__isset()、__unset()、__call()、__callStatic()六个魔术方法

    哎呀呀,今天小仓鼠学到了魔术方法,简称魔法,哈哈哈哈,神经病啊~ 平时在面试的时候,也会遇到问魔术方法有哪些的问题哦!今天我们来了解一下下~ 1.__get() 形式: __get($objName) ...

  5. 你想的到想不到的 javascript 应用小技巧方法

    javascript 在前端应用体验小技巧继续积累. 事件源对象 event.srcElement.tagName event.srcElement.type 捕获释放 event.srcElemen ...

  6. PHP中的魔术方法:__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone and __autoload

    1.__get.__set 这两个方法是为在类和他们的父类中没有声明的属性而设计的: __get( $property ) 当调用一个未定义的属性时访问此方法: __set( $property, $ ...

  7. PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toStr

    PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep ...

  8. PHP 魔术方法 __call 与 __callStatic 方法

    PHP 魔术方法 __call 与 __callStatic 方法 PHP 5.3 后新增了 __call 与 __callStatic 魔法方法. __call 当要调用的方法不存在或权限不足时,会 ...

  9. 关于PHP魔术方法__call的一点小发现

    好久没有上博客园写文章了,今晚终于有点空了,就来写一下昨天的一点小发现. 我自己所知,C++,Java的面向对象都有多态的特点,而PHP没有,但PHP可以通过继承链方法的重写来实现多态的属性.而魔术方 ...

随机推荐

  1. Intel DAAL AI加速 ——传统决策树和随机森林

    # file: dt_cls_dense_batch.py #===================================================================== ...

  2. Thinking in Java笔记之类及对象的初始化

    最近在看<Thinking in Java>这本书,之前一直对类及对象的初始化过程不太清楚,只是感到很模糊.看了这本书关于对象初始化的部分,终于搞明白了. 废话不多说,先上两个例子,实例摘 ...

  3. Oracle Rman 增量备份与差异备份

    一.增量与差异 关于Incremental增量备份级别: Oracle 9i 共有五种级别 0 1 2 3 4,0级最高-4级最低,0级是1级的基础以此类推. Oracle 10g官方文档明确指出增量 ...

  4. express学习-express搭建后台

    前言:本文是纯用node express做一个后端服务的教程,并不等同于express官网的入门教程,本文也并不涉及任何高级的Node服务端性能优化等知识. 本文是在已经看过express官方入门指南 ...

  5. Spring Data操作Redis时,发现key值出现 \xac\xed\x00\x05t\x00\tb

    原文链接:http://blog.csdn.net/yunhaibin/article/details/9001198 最近在研究redis,以及spring data对redis的支持发现了一个奇怪 ...

  6. 20165202 Mypwd

    实现mypwd(选做,加分) 1 学习pwd命令 2 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 3 实现mypwd 4 测试mypwd 提交过程博客的链接 实现过程 使用m ...

  7. 数据库SQL优化大总结之 百万级数据库优化方案(转载)

    网上关于SQL优化的教程很多,但是比较杂乱.近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充. 这篇文章我花费了大量的时间查找资料.修改.排版,希望大家阅读之后,感觉 ...

  8. java poi 写入大量数据到excel中

    最近在利用poi往excel中写入大量数据时,发现excel2003最多只支持65535条,大量数据时容易造成oom,上网查了一下api,发现目前对于2003,每个sheet最多支持65535条,若数 ...

  9. css实现垂直居中的几种方法

    方法1.这个方法把一些 div 的显示方式设置为表格,因此我们可以使用表格的 vertical-align 属性. #wrapper { //代表父元素 display: table; } #cell ...

  10. Okhttp对http2的支持简单分析

    在< Okhttp之RealConnection建立链接简单分析>一文中简单的分析了RealConnection的connect方法的作用:打开一个TCP链接或者打开一个隧道链接,在打开t ...