PHP实用小技巧之调用录像的方法
时间:2022-07-27
本文章向大家介绍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 中间件 的实现
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对ZaLou.Cn的支持。
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- 使用Go语言编译互联网视频直播点播平台EasyDSS出现ld returned 1 exit status错误
- c/c++补完计划(四): 字节对齐和虚继承
- Python 不用selenium 带你高效爬取京东商品评论
- 《闲扯Redis六》Redis五种数据类型之Hash型
- rocketmq学习2
- Python全栈(八)Flask项目实战之1.项目搭建
- 一起来读开源项目的代码-Agar.io为例
- C语言入门系列之11.文件和文件操作
- 自己动手改造 Jetpack LiveData
- FastDFS基于Docker安装
- 用Python实现批量高效文件处理 解放你的双手
- Windows下使用VS2013编译使用SDL库
- C语言经典习题100例(一)1-5
- C语言经典习题100例(二)6-10
- Python 快速验证代理IP是否有效