PHP实现链式操作的三种方法详解


Posted in PHP onNovember 16, 2017

本文实例讲述了PHP实现链式操作的三种方法。分享给大家供大家参考,具体如下:

在php中有很多字符串函数,例如要先过滤字符串收尾的空格,再求出其长度,一般的写法是:

strlen(trim($str))

如果要实现类似js中的链式操作,比如像下面这样应该怎么写?

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

下面分别用三种方式来实现:

方法一、使用魔法函数__call结合call_user_func来实现

思想:首先定义一个字符串类StringHelper,构造函数直接赋值value,然后链式调用trim()和strlen()函数,通过在调用的魔法函数__call()中使用call_user_func来处理调用关系,实现如下:

<?php
class 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来实现

<?php
class 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 相关文章推荐
PHP4在Windows2000下的安装
Oct 09 PHP
PHP容易忘记的知识点分享
Apr 30 PHP
php 启动时报错的简单解决方法
Jan 27 PHP
php去除换行(回车换行)的三种方法
Mar 26 PHP
PHP模板引擎Smarty的缓存使用总结
Apr 24 PHP
php数组查找函数总结
Nov 18 PHP
PHP扩展程序实现守护进程
Apr 16 PHP
CodeIgniter与PHP5.6的兼容问题
Jul 16 PHP
php获取目录中所有文件名及判断文件与目录的简单方法
Mar 04 PHP
PHP守护进程化在C和PHP环境下的实现
Nov 21 PHP
PHP保留两位小数的几种方法
Jul 24 PHP
PHP mkdir创建文件夹实现方法解析
Nov 13 PHP
thinkphp5.0自定义验证规则使用方法
Nov 16 #PHP
PHP实现验证码校验功能
Nov 16 #PHP
学习thinkphp5.0验证类使用方法
Nov 16 #PHP
thinkPHP中钩子的使用方法实例分析
Nov 16 #PHP
php表单处理操作
Nov 16 #PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
Nov 16 #PHP
Laravel下生成验证码的类
Nov 15 #PHP
You might like
PHP+Mysql基于事务处理实现转账功能的方法
2015/07/08 PHP
php递归实现无限分类的方法
2015/07/28 PHP
大家都应该掌握的PHP关联数组使用技巧
2015/12/25 PHP
PHP实现文字写入图片功能
2019/02/18 PHP
php实现的顺序线性表示例
2019/05/04 PHP
JQuery团队打造的javascript单元测试工具QUnit介绍
2010/02/26 Javascript
autoPlay 基于jquery的图片自动播放效果
2011/12/07 Javascript
Javascript获取窗口(容器)的大小及位置参数列举及简要说明
2012/12/09 Javascript
jQuery基础知识小结
2014/12/22 Javascript
JS拖动鼠标画出方框实现鼠标选区的方法
2015/08/05 Javascript
JS 对java返回的json格式的数据处理方法
2016/12/05 Javascript
妙用缓存调用链实现JS方法的重载
2018/04/30 Javascript
Vue中 v-if/v-show/插值表达式导致闪现的原因及解决办法
2018/10/12 Javascript
详解关于html,css,js三者的加载顺序问题
2019/04/10 Javascript
Javascript模拟实现new原理解析
2020/03/03 Javascript
JavaScript对象字面量和构造函数原理与用法详解
2020/04/18 Javascript
js实现磁性吸附的示例
2020/10/26 Javascript
[01:16:37]【全国守擂赛】第三周决赛 Dark Knight vs. 一个弱队
2020/05/04 DOTA
Python实现的二维码生成小软件
2014/07/11 Python
在 Python 应用中使用 MongoDB的方法
2017/01/05 Python
python 反向输出字符串的方法
2018/07/16 Python
python 保存float类型的小数的位数方法
2018/10/17 Python
python射线法判断一个点在图形区域内外
2019/06/28 Python
Python 使用folium绘制leaflet地图的实现方法
2019/07/05 Python
python实现身份证实名认证的方法实例
2019/11/08 Python
利用python生成照片墙的示例代码
2020/04/09 Python
浅析Python的命名空间与作用域
2020/11/25 Python
利用python爬取有道词典的方法
2020/12/08 Python
CSS3弹性伸缩布局之box布局
2016/07/12 HTML / CSS
HTML5中视频音频的使用详解
2017/07/07 HTML / CSS
Kangol帽子官网:坎戈尔袋鼠
2018/09/26 全球购物
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?用contains来区分是否有重复的对象。还是都不用
2013/07/30 面试题
Nginx中break与last的区别详析
2021/03/31 Servers
Python中使用subprocess库创建附加进程
2021/05/11 Python
Python进度条的使用
2021/05/17 Python
python基础之函数的定义和调用
2021/10/24 Python