在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 三种方式实现链式操作相关推荐

  1. php支持链式操作,PHP三种方式实现链式操作-php教程

    正在php中有不少字符串函数,例如要先过滤字符串收尾的空格,再求出其长度,普通的写法是: strlen(trim($str)) 假如要完成相似js中的链式操作,比方像上面这样应该怎样写? $str-& ...

  2. php 声音文件链 处理,PHP 三种方式实现链式操作

    在php中有很多字符串函数,例如要先过滤字符串收尾的空格,再求出其长度,一般的写法是: strlen(trim($str)) 如果要实现类似js中的链式操作,比如像下面这样应该怎么写? $str-&g ...

  3. 读取Java文件到byte数组的三种方式及Java文件操作大全(包括文件加密,String加密)

    读取Java文件到byte数组的三种方式 package zs;import java.io.BufferedInputStream; import java.io.ByteArrayOutputSt ...

  4. 元素等待的三种方式(隐式等待、显示等待、强制等待)

    目录 隐式等待 显示等待 强制等待 如何选用等待方式 隐式等待 # 隐式等待:设置一个超时时间,在这个时间内,不断的寻找元素,超时找不到就抛出异常 driver.implicitly_wait(10) ...

  5. PHP 链式操作 - 学习/实践

    1.应用场景 了解学习借鉴 php[框架中]实现链式操作实现原理 2.学习/操作 测试环境: win10 64位 专业版 2.1 //适用于php 自带的内置函数调用 比如: 在php中有很多字符串函 ...

  6. Linux中设置服务自启动的三种方式

    有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务 主要用三种方式进行这一操作: ln -s                       在/etc/rc.d/rc*.d目录中建立/e ...

  7. Linux中设置服务自启动的三种方式(转)

    有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务 主要用三种方式进行这一操作: ln -s                       在/etc/rc.d/rc*.d目录中建立/e ...

  8. javascript-入门篇-使用js的三种方式

    练习题: 弹出窗口,提示语句"hello js" <script>alert("hello js"); </script> javasc ...

  9. linux设置开机自启服务,linux设置服务开机自启动的三种方式

    linux设置服务开机自启动的三种方式 这里介绍一下linux开机自动启动的几种方法,共计3种,大家可以借鉴一下!经验里面以centos 5.3系统为例! 方法1:.利用ntsysv命令进行设置,利用 ...

  10. linux系统中开机自启的三种方式

    有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务 主要用三种方式进行这一操作: ln -s 在/etc/rc.d/rc*.d目录中建立/etc/init.d/服务的软链接(*代表0- ...

最新文章

  1. Python中的matplotlib xticks
  2. kibana一直弹出来报错?
  3. python打包exe os模块_python打包成exe格式的方法求教
  4. D. Best Edge Weight(最小生成树 + 树链剖分)(Codeforces Round #423 (Div. 1, rated, based on VK Cup Finals))
  5. 转:json与map互转
  6. opencv学习笔记2--存取图像元素
  7. @JsonFormat失效解决
  8. MongoDB 基础相关(二) 常用语句
  9. 自定义手势--输入法手势技术
  10. 【MySQL】B-Tree 索引和数据的碎片 以及 Alert Table 会触发数据整理?
  11. 测试iis后台webservice服务_C#的WebService完全教程(之五)
  12. 女式T恤行业调研报告 - 市场现状分析与发展前景预测
  13. 机房监控系统解说—开关传感器篇
  14. 探索SpringCloud+ES实现高性能全文检索
  15. 上海铭控:无线数字压力表正确的安装方式!
  16. DeepFlow:做好云原生时代的网络监控
  17. 回忆做嵌入式软件的几年
  18. JumpServer七周年:感谢社区的老铁们为我们点赞
  19. 单片机--定时器/计数器实验
  20. MongoDB 的应用开发者生态建设调查及启示

热门文章

  1. centos locale报错问题
  2. How to Be Cool at College
  3. netlink 0001 --- 基础简介
  4. linux内核C -- 第04课:Linux内核第一宏——container_of
  5. 立下2019年的Flag,鞭策自己,使命宣言
  6. Linux进程的管理与调度(三) -- Linux进程ID号
  7. uboot驱动模型(DM)分析(二)
  8. 工程项目利用AutoMake生成Makefile实战
  9. Hdu1412 (set......Java)
  10. linux java Cannot allocate memory