PHP链式操作基本原理,call_user_func(),call_user_func_array()和Magic Methods__get(),__set(),__call()的用法

前言

在阅读框架源码时发现源码中大量使用到了链式操作,和call_user_func()call_user_func_array()这种调用函数的方法;
虽然两者并无关联,但是目的都是使代码更简洁,逻辑更清晰。
整理一些资料和大家一起学习。


call_user_func()call_user_func_array()

call_user_func():把第一个参数作为回调函数调用,后面的参数作为回调函数的参数;
http://php.net/manual/zh/function.call-user-func.php

call_user_func_array():调用回调函数,并把一个数组参数作为回调函数的参数,第二各数组参数作为回调函数的参数。
http://php.net/manual/zh/function.call-user-func-array.php

两种方法类似,在不同的情况下有不同的参数传递方式,现在以call_user_func()为例讲一下各种情况:

回调函数可以用匿名函数,可以用有名函数,可以传递类的方法,

第一个参数为有名函数时,只需传函数的名称,用类的方法时,要传类的名称和方法名

内部方法作为回调函数:


外部类作为回调函数:


外部类还可以通过相对路径的方法作为回调函数:
例如:回调函数为'\\think\\paginator\\driver\\'下的getCurrentPage方法,参数为$var_page

        $class = '\\think\\paginator\\driver\\' ;
        $page  = call_user_func([
            $class,
            'getCurrentPage',
        ],$var_page);

第一个参数为匿名函数时:
call_user_func函数是php引用匿名函数的一种方式,php不像js那样,可以把匿名函数赋值给变量并引用,但可以通过call_user_func函数来调用匿名函数,这也能做到局部变量不被全局污染。

';
    echo ++$call,'
'; },1);

链式操作的原理

参考:https://www.jb51.net/article/103836.htm

链式操作的核心是返回$this指针,让后面的函数进行调用,和参数的共享!

结合__get(),__set(),__call()__construct(构造方法)进行实现:

__construct 构造方法,创建类时调用
__get()是访问不存在的成员变量时调用;
__set()是设置不存在的成员变量时调用;
__call()当调用类中不存在的方法时调用。

通常在计算字符串函数的时候,要先对字符串进行过滤空格,然后再求其长度:

strlen(trim($str))

但是怎样才能以链式操作的形式实现?

$str->trim()->strlen();

核心思想:

链式操作,类的生命周期的结束在链式操作的末尾,所有可以通过成员变量的方式进行参数的共享,通过__construct进行成员变量的赋值,通过__get(),__set(),__call()来处理调用关系。

value = $value;
  }
 
  function __call($function, $args){
    $this->value = call_user_func($function, $this->value, $args[0]);//调用外部的trim()方法,传入2个参数
    return $this;
  }
 
  function strlen() {
    return strlen($this->value);
  }
}
 
$str = new StringHelper("hi boys and girls ! ");
echo $str->trim('0')->strlen();

查看更多:Magic Methods http://php.net/manual/zh/language.oop5.magic.php

最后

这里介绍的链式操作为其最基本的原理,而在框架中它又是如何被灵活运用呢?

敬请关注,后续文章!(o゜▽゜)o☆

你可能感兴趣的:(PHP,Thinkphp5)