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方法的使用

PHP中的__call和__callStatic方法(未看完)

PHP魔术方法之__call与__callStatic方法

PHP __callStatic() 拿不到参数的情况

PHP __callStatic() 拿不到参数的情况