PHP 三种方式实现链式操作
在php中有很多字符串函数,例如要先过滤字符串收尾的空格,再求出其长度,一般的写法是:
strlen(trim($str))
如果要实现类似js中的链式操作,比如像下面这样应该怎么写?
$str->trim()->strlen()
下面分别用三种方式来实现:
方法一、使用魔法函数__call
结合call_user_func
来实现
思想:首先定义一个字符串类StringHelper
,构造函数直接赋值value,然后链式调用trim()
和strlen()
函数,通过在调用的魔法函数__call()
中使用call_user_func
来处理调用关系,实现如下:
<?phpclass StringHelper
{private $value;function __construct($value){$this->value = $value;}function __call($function, $args){$this->value = call_user_func($function, $this->value, $args[0]);return $this;}function strlen() {return strlen($this->value);}
}$str = new StringHelper(" sd f 0");
echo $str->trim('0')->strlen();
终端执行脚本:
php test.php
8
方法二、使用魔法函数__call
结合call_user_func_array
来实现
<?phpclass StringHelper
{private $value;function __construct($value){$this->value = $value;}function __call($function, $args){array_unshift($args, $this->value);$this->value = call_user_func_array($function, $args);return $this;}function strlen() {return strlen($this->value);}
}$str = new StringHelper(" sd f 0");
echo $str->trim('0')->strlen();
说明:
array_unshift(array,value1,value2,value3...)
array_unshift()
函数用于向数组插入新元素。新数组的值将被插入到数组的开头。
call_user_func()
和call_user_func_array
都是动态调用函数的方法,区别在于参数的传递方式不同。
方法三、不使用魔法函数__call
来实现
只需要修改_call()
为trim()
函数即可:
public function trim($t)
{$this->value = trim($this->value, $t);return $this;
}
重点在于,返回$this指针,方便调用后者函数。
PHP 三种方式实现链式操作相关推荐
- php支持链式操作,PHP三种方式实现链式操作-php教程
正在php中有不少字符串函数,例如要先过滤字符串收尾的空格,再求出其长度,普通的写法是: strlen(trim($str)) 假如要完成相似js中的链式操作,比方像上面这样应该怎样写? $str-& ...
- php 声音文件链 处理,PHP 三种方式实现链式操作
在php中有很多字符串函数,例如要先过滤字符串收尾的空格,再求出其长度,一般的写法是: strlen(trim($str)) 如果要实现类似js中的链式操作,比如像下面这样应该怎么写? $str-&g ...
- 读取Java文件到byte数组的三种方式及Java文件操作大全(包括文件加密,String加密)
读取Java文件到byte数组的三种方式 package zs;import java.io.BufferedInputStream; import java.io.ByteArrayOutputSt ...
- 元素等待的三种方式(隐式等待、显示等待、强制等待)
目录 隐式等待 显示等待 强制等待 如何选用等待方式 隐式等待 # 隐式等待:设置一个超时时间,在这个时间内,不断的寻找元素,超时找不到就抛出异常 driver.implicitly_wait(10) ...
- PHP 链式操作 - 学习/实践
1.应用场景 了解学习借鉴 php[框架中]实现链式操作实现原理 2.学习/操作 测试环境: win10 64位 专业版 2.1 //适用于php 自带的内置函数调用 比如: 在php中有很多字符串函 ...
- Linux中设置服务自启动的三种方式
有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务 主要用三种方式进行这一操作: ln -s 在/etc/rc.d/rc*.d目录中建立/e ...
- Linux中设置服务自启动的三种方式(转)
有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务 主要用三种方式进行这一操作: ln -s 在/etc/rc.d/rc*.d目录中建立/e ...
- javascript-入门篇-使用js的三种方式
练习题: 弹出窗口,提示语句"hello js" <script>alert("hello js"); </script> javasc ...
- linux设置开机自启服务,linux设置服务开机自启动的三种方式
linux设置服务开机自启动的三种方式 这里介绍一下linux开机自动启动的几种方法,共计3种,大家可以借鉴一下!经验里面以centos 5.3系统为例! 方法1:.利用ntsysv命令进行设置,利用 ...
- linux系统中开机自启的三种方式
有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务 主要用三种方式进行这一操作: ln -s 在/etc/rc.d/rc*.d目录中建立/etc/init.d/服务的软链接(*代表0- ...
最新文章
- Python中的matplotlib xticks
- kibana一直弹出来报错?
- python打包exe os模块_python打包成exe格式的方法求教
- D. Best Edge Weight(最小生成树 + 树链剖分)(Codeforces Round #423 (Div. 1, rated, based on VK Cup Finals))
- 转:json与map互转
- opencv学习笔记2--存取图像元素
- @JsonFormat失效解决
- MongoDB 基础相关(二) 常用语句
- 自定义手势--输入法手势技术
- 【MySQL】B-Tree 索引和数据的碎片 以及 Alert Table 会触发数据整理?
- 测试iis后台webservice服务_C#的WebService完全教程(之五)
- 女式T恤行业调研报告 - 市场现状分析与发展前景预测
- 机房监控系统解说—开关传感器篇
- 探索SpringCloud+ES实现高性能全文检索
- 上海铭控:无线数字压力表正确的安装方式!
- DeepFlow:做好云原生时代的网络监控
- 回忆做嵌入式软件的几年
- JumpServer七周年:感谢社区的老铁们为我们点赞
- 单片机--定时器/计数器实验
- MongoDB 的应用开发者生态建设调查及启示
热门文章
- centos locale报错问题
- How to Be Cool at College
- netlink 0001 --- 基础简介
- linux内核C -- 第04课:Linux内核第一宏——container_of
- 立下2019年的Flag,鞭策自己,使命宣言
- Linux进程的管理与调度(三) -- Linux进程ID号
- uboot驱动模型(DM)分析(二)
- 工程项目利用AutoMake生成Makefile实战
- Hdu1412 (set......Java)
- linux java Cannot allocate memory