• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    PHP实用小技巧之调用录像的方法

    主要功能

    把你实际的调用操作录下来,然后在你想要的地方重新调用

    和匿名函数的作用基本一样,暂存你的调用操作 一般用于链式调用, 然后实际作用于你想要操作的对象上面

    好像和没说一样

    使用场景

    假如 laravel 项目用到了 仓库模式, 然后对于比较复杂的查询条件,一般情况下有三种操作

    现在可以对第三种方法进行优化,传入一个下面代码里的 CallEcho 对象

    //控制器里
    $callEcho = (new CallEcho())->where("username", "马云")->where("is_boss", 1)->first();
    $fubao = (new UserRepository)->first($callEcho);
    
    //仓库类
    class UserRepository{
      public function first(CallEcho $callEcho){
        return $callEcho->invoke(new User());
      }
    }

    看着和匿名函数差不多,但是 CallEcho 可以被继承来实现些接口,继承后还可以对查询条件进行一些操作,比如过滤什么的。用匿名函数的话,完全就看调用方的良心了。

    最重要的是不传对象传函数叫什么面对对象

    上代码

    class CallEcho
    {
    
      protected $callable = null;
    
      public function __construct()
      {  
        //callable 初始化
        $this->seed();
      }
    
      protected function seed(){
        $this->callable = $this;
      }
    
      public function __invoke($obj)
      {
        return $obj;
      }
    
      public function __call($name, $arguments)
      {
        $current = $this->callable;
        /**
         * 每产生__call,就往callable上面裹一层
         */
        $this->callable = function($obj) use($name, $arguments, $current){
          return call_user_func_array($current, [$obj])->{$name}(...$arguments);
        };
        return $this;
      }
      
      //作用于真正的对象上面
      public function invoke($obj){
        return call_user_func_array($this->callable, [$obj]);
      }
    }

    简单的测试 以及 使用

    class TestCallEcho{
      protected $called = [];
    
      public function __call($name, $arguments)
      {
        $this->called[] = [$name, $arguments];
        return $this;
      }
    
      public function end(){
        $this->called[] = "end";
        return $this;
      }
    
      public function getCalled(){
        return $this->called;
      }
    }
    
    function testArrayEq($array1, $array2){
      if(count($array1) !== count($array2)){
        return false;
      }
    
      foreach ($array1 as $index => $value1){
        if(!isset($array2[$index])){
          return false;
        }
        $value2 = $array2[$index];
    
        if(is_array($value1)  is_array($value2)){
          if(!testArrayEq($value1, $value2)){
            return false;
          }else{
            //继续判断
          }
        }else{
          if($value1 !== $value2){
            return false;
          }
        }
      }
      return true;
    }
    
    function testTestArrayEq(){
      $array1 = [1, 2];
      $array2 = [1, 3];
      $array3 = [1, 2, 3];
    
      assert(testArrayEq($array1, $array2) == false);
      assert(testArrayEq($array1, $array3) == false);
      assert(testArrayEq($array1, $array1) == true);
    }
    testTestArrayEq();
    
    $obj = new \stdClass();
    $callEcho = new CallEcho();
    
    /*************重点开始****************/
    /** @var CallEcho $callEcho */
    $callEcho = $callEcho->testNumber(1)->testString("myname")->testObj($obj)->testMulti(1, "myname")->testMulti2("1", $obj)->end();
    
    /** @var TestCallEcho $testCallEcho */
    $testCallEcho = $callEcho->invoke(new TestCallEcho());
    /************重点结束****************/
    
    //基本上和这个作用一样
    $a = function($obj){
      $obj->testNumber(1)->testString("myname")->testObj($obj)->testMulti(1, "myname")->testMulti2("1", $obj)->end();
    };
    
    
    $called = $testCallEcho->getCalled();
    
    $eq = testArrayEq($called, [
      ["testNumber", [1]],
      ["testString", ["myname"]],
      ["testObj", [$obj]],
      ["testMulti", [1, "myname"]],
      ["testMulti2", ["1", $obj]],
      "end"
    ]);
    assert($eq);

    PS

    灵感来源于slim3 中间件 的实现

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

    您可能感兴趣的文章:
    • 分享五个PHP7性能优化提升技巧
    • PHP后门隐藏的一些技巧总结
    • php提高脚本性能的4个技巧
    • php把文件设置为插件的技巧方法
    • PHP学习的技巧和学习的要素总结
    • php探针使用原理和技巧讲解
    • php和vue配合使用技巧和方法
    • php技巧小结【推荐】
    • 浅谈PHP7中的一些小技巧
    上一篇:Laravel框架控制器,视图及模型操作图文详解
    下一篇:Laravel框架DB facade数据库操作详解
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    PHP实用小技巧之调用录像的方法 PHP,实用,小,技巧,之,调用,