PHP链式操作通过call和callstatic魔术方法的实现,以及phpstorm通过注释去追踪function
Posted 哈尔滨洛弘科技有限公司
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP链式操作通过call和callstatic魔术方法的实现,以及phpstorm通过注释去追踪function相关的知识,希望对你有一定的参考价值。
php链式操作通过call和callstatic魔术方法的实现,以及phpstorm通过注释去追踪function
在使用之前我们先了解下call和callstatic的用法
call在当前类下检测到不存在的方法
则会调用call方法
callstatic在当前类下检测到不存在的静态方法
则会调用callstatic
callstatic使用实例
代码片段一
<?php
namespace rely;
/**
* Class Init
* @package rely
* @author Mr.taochuang <mr_taochuang@163.com>
* @date 2019/7/3 10:34
*
* 依赖包基础类
*
* @method \\rely\\init\\Dataswitch dataswitch() static 数据处理类
* @method \\rely\\init\\Regex regex() static 正则管理类库
* @method \\rely\\init\\File file() static 文件处理
* @method \\rely\\init\\Config config($config=[]) static 配置类
* @method \\rely\\curl\\Driver curl($config=[]) static curl请求类
* @method \\rely\\encry\\Rsa rsa($config=[]) static Rsa加密
* @method \\rely\\encry\\Custom encry() static 自定义加密
* @method \\rely\\encry\\Aes aes($config=[]) static aes加密
* @method \\rely\\cache\\Redis redis($config=[]) static redis缓存机制
* @method \\rely\\cache\\File cache($config=[]) static 文件缓存机制
* @method \\rely\\alg\\Business business_alg() static 业务算法
* @method \\rely\\Init\\Http http() static http 处理类
* @method \\rely\\alg\\Email email() static 邮件发送类
*
*/
class Init
public static function __callStatic($class, $arguments)
return (new \\ReflectionClass(Facade::bind($class)))->newInstanceArgs($arguments);
代码片段二(辅助第一个代码片段
)
<?php
namespace rely;
use rely\\alg\\Email;
use rely\\init\\File;
use rely\\cache\\File as Cache;
use rely\\cache\\Redis;
use rely\\curl\\Driver as Curl;
use rely\\encry\\Aes;
use rely\\encry\\Rsa;
use rely\\encry\\Custom;
use rely\\init\\Http;
use rely\\init\\Regex;
use rely\\init\\Config;
use rely\\init\\Dataswitch;
use rely\\alg\\Business;
class Facade
/**
* 容器绑定标识
*/
private static $bind = [
'dataswitch' => Dataswitch::class,
'config' => Config::class,
'curl'=>Curl::class,
'rsa'=>Rsa::class,
'encry'=>Custom::class,
'aes'=>Aes::class,
'regex'=>Regex::class,
'redis'=>Redis::class,
'cache'=>Cache::class,
'file'=>File::class,
'business_alg'=>Business::class,
'email'=>Email::class,
'http'=>Http::class
];
/**
* @param $class
* @return mixed
* @throws \\Exception
* 类库绑定
*/
public static function bind($class)
if (empty(self::$bind[$class]) || !class_exists(self::$bind[$class])) throw new \\Exception('Class does not exist');
return self::$bind[$class];
此Init类库的使用方法
<?php
use rely/Init;
Init::dataswitch()->toArray();
call方法和callstatic使用基本相似,就不过多描述了
我们来解释下为什么会这么用
静态访问一个不存在的方法则会触发callstatic方法(第一个参数为不存在的方法名,第二个参数为调用这个方法所传的参数)
我们看下里面的操作 方法里return 了一个当前类库不存在的一个实例类,并且把参数传入这个实力类,也就是这个dataswitch
类
在Facade
这个类库完成的是需要调用类库位置的绑定,
Facade::bind($class)
将这个不存在的dataswitch
方法映射到相应的dataswitch类库里,实际上这个callstatic
完成的操作步骤为
访问主类库->运行callstatic并绑定所要操作的类库->调用此类库所封装的方法->结果的输出
这样可以通过一个主类库去调用多个类库里的方法,实现链式操作,更好的去引用方法和多种类类库的管理
phpstorm有追踪代码的功能,如何能用来追踪呢
* @method \\rely\\alg\\Email email() static 邮件发送类
method代表寻找一个方法,第一字段为方法所在的位置,第二个字段为方法名称, 第三个字段属于什么类型的方法,最后的注释可以自行备注
这样就可以通过phpstorm追踪到我所要调用的方法所在的位置
实际上call和callstatic是为了完成一系列的链式操作,可以通过主类库去实现多个类库的引用,让我们可以通过更简单的代码去完成更多的操作,让我们的代码规整,维护和使用更快捷
以上是关于PHP链式操作通过call和callstatic魔术方法的实现,以及phpstorm通过注释去追踪function的主要内容,如果未能解决你的问题,请参考以下文章
php中__call() 和 __callStatic方法的使用
php中__call() 和 __callStatic方法的使用