PHP 小技巧之__callStatic魔术方法使用
使用 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魔术方法使用的更多相关文章
- 懒人小技巧, Toad 常用偷懒方法
用toad很久了, 感叹它的功能强大的同时整理了一些相关技巧, 有以前在网上看到的也有自己平时用的时候偶尔发现的, 分享一下, 它对用户体验方面做的真的很到位, 通过各种方式来方便用户的操作. 菜鸟 ...
- 20191125PHP抽象类、接口和魔术方法
抽象类 不能被实例化,用于其他类的继承.使用abstract(抽象).抽象方法一定是抽象类,抽象类不一定有抽象方法. 接口interface是特殊的抽象类. eg: <?php //抽象类 ab ...
- PHP中的常用魔术方法
魔术方法: 是指某些情况下,会自动调用的方法,称为魔术方法 php面向对象中,提供了这几个魔术方法,他们的特点都是 以双下划线__开头的 __construct() 构造方法 __destruct( ...
- PHP:__get()、__set()、__isset()、__unset()、__call()、__callStatic()六个魔术方法
哎呀呀,今天小仓鼠学到了魔术方法,简称魔法,哈哈哈哈,神经病啊~ 平时在面试的时候,也会遇到问魔术方法有哪些的问题哦!今天我们来了解一下下~ 1.__get() 形式: __get($objName) ...
- 你想的到想不到的 javascript 应用小技巧方法
javascript 在前端应用体验小技巧继续积累. 事件源对象 event.srcElement.tagName event.srcElement.type 捕获释放 event.srcElemen ...
- PHP中的魔术方法:__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone and __autoload
1.__get.__set 这两个方法是为在类和他们的父类中没有声明的属性而设计的: __get( $property ) 当调用一个未定义的属性时访问此方法: __set( $property, $ ...
- PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toStr
PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep ...
- PHP 魔术方法 __call 与 __callStatic 方法
PHP 魔术方法 __call 与 __callStatic 方法 PHP 5.3 后新增了 __call 与 __callStatic 魔法方法. __call 当要调用的方法不存在或权限不足时,会 ...
- 关于PHP魔术方法__call的一点小发现
好久没有上博客园写文章了,今晚终于有点空了,就来写一下昨天的一点小发现. 我自己所知,C++,Java的面向对象都有多态的特点,而PHP没有,但PHP可以通过继承链方法的重写来实现多态的属性.而魔术方 ...
随机推荐
- Nginx在windows上安装 及 Nginx的配置及优化
https://www.cnblogs.com/Chiler/p/8027167.html http://www.runoob.com/linux/nginx-install-setup.html 前 ...
- Oracle连接知识
Oracle基本连接知识 登录sys用户或 sysdba用户权限的账号 Sqlplus 建用户 Create user test identified by 12345678 ...
- iis 7 asp.net ajax post 请求字节过大报错问题解决办法
遇到一个ajax post 提交新闻资讯类的文章,报 {"Message":"There was an error processing the request.&quo ...
- java正则获取括号内的数据与排除括号内的数据
1.正则获取括号内的数据 /** * 获取指定字符串中括号内的内容,返回字符串数组 * @param content * @return */ public String[] getBracketCo ...
- SharePoint 会话(Session)状态和状态服务
1. 启用会话状态 Enable-SPSessionStateService –DefaultProvision 或 Enable-SPSessionStateService –DatabaseNam ...
- <转>字符编码
转: 字符编码笔记:ASCII,Unicode和UTF-8 作者: 阮一峰 日期: 2007年10月28日 今天中午,我突然想搞清楚Unicode和UTF-8之间的关系,于是就开始在网上查资料. ...
- ZOJ 17届校赛 Knuth-Morris-Pratt Algorithm( 水题)
In computer science, the Knuth-Morris-Pratt string searching algorithm (or KMP algorithm) searches f ...
- 正则表达式,清除HTML标签,但要保留 <br>和<img>标签,其他的清除
最近有个需求, 要替换到html当中的除了br和img以外的所有标签, 遂百度之, 在百度知道遇到大神 , 在这记录一下 /<(?!\/?br\/?.+?>|\/?img.+?>)[ ...
- HP LoadRunner 12.02 Tutorial T7177-88037教程独家中文版
HP LoadRunner 12.02 Tutorial T7177-88037教程独家中文版 Tylan独家呕血翻译 转载请注明出自“天外归云”的博客园 Welcome to the LoadRun ...
- [LeetCode&Python] Problem 617. Merge Two Binary Trees
Given two binary trees and imagine that when you put one of them to cover the other, some nodes of t ...