在阅读框架源码时发现源码中大量使用到了链式操作,和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☆