使用 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. sublime 个人心得

    sublime 3快捷键: (1) Ctrl+O(Command+O)可以实现头文件和源文件之间的快速切换 (2) 双击可选中光标所在单词,三击可选中光标所在行(等同于Ctrl+L(Command+L ...

  2. dubbo为consumer创建代理

    ReferenceConfig.init()方法中获取到了最终的代理对象,先观察一下代理对象的视图. 默认使用javassist生成动态类,可配置proxy为jdk,则使用jdk动态代理: <d ...

  3. Unicode与UTF-8,UTF-16

    Unicode(UTF-8, UTF-16)令人混淆的概念 为啥需要Unicode 我们知道计算机其实挺笨的,它只认识0101这样的字符串,当然了我们看这样的01串时肯定会比较头晕的,所以很多时候为了 ...

  4. PHP:第三章——PHP中控制函数的函数

    <pre> <?php header("Content-Type:text/html;charset=utf-8"); /******************** ...

  5. Linux免密码登陆

    A电脑实现不用密码登陆到B电脑! vim /etc/ssh/sshd_config   编辑文件 01.在A电脑上生成ssh密钥 ssh-keygen -t rsa02.把A电脑生成的id_rsa.p ...

  6. 循环队列 c 实现!!!!

    上数据结构课的时候老师让写了一个循环队列子系统. 代码如下: #include<stdio.h> #include<malloc.h> #define MAXLEN 100 # ...

  7. ansible 循环register

    在有循环的task中使用register,register保存的是一个列表,整个属性为results results 是一个单个循环返回的结果的列表 - debug: msg="{{ ite ...

  8. [leetcode] 94. Binary Tree Inorder Traversal 二叉树的中序遍历

    题目大意 https://leetcode.com/problems/binary-tree-inorder-traversal/description/ 94. Binary Tree Inorde ...

  9. SpringAop与AspectJ

    AspectJ AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件. spring ao ...

  10. 如何在win10(64位系统)上安装apache服务器

    今天装了Apache服务器,下面是我总结的方法: 一,准备软件 1.64位的apache版本 传送门:http://www.apachelounge.com/download/ 2.VC11运行库 下 ...