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


Posted in PHP onJanuary 21, 2017

在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 多维数组排序(usort,uasort)
Jun 30 PHP
破解图片防盗链的代码(asp/php)测试通过
Jul 02 PHP
PHP设计模式 注册表模式
Feb 05 PHP
php foreach循环中使用引用的问题
Nov 06 PHP
利用yahoo汇率接口实现实时汇率转换示例 汇率转换器
Jan 14 PHP
php的socket编程详解
Nov 20 PHP
php实现的redis缓存类定义与使用方法示例
Aug 09 PHP
php把字符串指定字符分割成数组的方法
Mar 12 PHP
PHP排序算法之归并排序(Merging Sort)实例详解
Apr 21 PHP
php基于Redis消息队列实现的消息推送的方法
Nov 28 PHP
PDO::getAvailableDrivers讲解
Jan 28 PHP
laravel自定义分页的实现案例offset()和limit()
Oct 15 PHP
PHP将字符串首字母大小写转换的实例
Jan 21 #PHP
thinkphp 手机号和用户名同时登录
Jan 20 #PHP
thinkphp实现把数据库中的列的值存到下拉框中的方法
Jan 20 #PHP
php curl常用的5个经典例子
Jan 20 #PHP
php技巧小结【推荐】
Jan 19 #PHP
Yii CDBCriteria常用方法实例小结
Jan 19 #PHP
PHP对象实例化单例方法
Jan 19 #PHP
You might like
教你如何把一篇文章按要求分段
2006/10/09 PHP
微信公众平台开发之配置与请求
2015/08/26 PHP
How to Auto Include a Javascript File
2007/02/02 Javascript
baidu博客的编辑友情链接的新的层窗口!经典~支持【FF】
2007/02/09 Javascript
改版了网上的一个js操作userdata
2007/04/27 Javascript
javascript TextArea动态显示剩余字符
2008/10/22 Javascript
JQERY limittext 插件0.2版(长内容限制显示)
2010/08/27 Javascript
XMLHTTP 乱码的解决方法(UTF8,GB2312 编码 解码)
2011/01/12 Javascript
深入理解JavaScript系列(9) 根本没有“JSON对象”这回事!
2012/01/15 Javascript
Function.prototype.call.apply结合用法分析示例
2013/07/03 Javascript
没有document.getElementByName方法
2013/08/19 Javascript
如何从jQuery的ajax请求中删除X-Requested-With
2013/12/11 Javascript
三种方式获取XMLHttpRequest对象
2014/04/21 Javascript
javascript实现的闭包简单实例
2015/07/17 Javascript
IOS中safari下的select下拉菜单文字过长不换行的解决方法
2016/09/26 Javascript
微信小程序左滑删除效果的实现代码
2017/02/20 Javascript
Mint UI 基于 Vue.js 移动端组件库
2017/11/07 Javascript
浅谈vue-router2路由参数注意的问题
2017/11/08 Javascript
Angular实现的简单查询天气预报功能示例
2017/12/27 Javascript
java实现单链表增删改查的实例代码详解
2019/08/30 Javascript
vue项目中自定义video视频控制条的实现代码
2020/04/26 Javascript
vue使用exif获取图片经纬度的示例代码
2020/12/11 Vue.js
Python简单定义与使用字典dict的方法示例
2017/07/25 Python
Python建立Map写Excel表实例解析
2018/01/17 Python
使用Python来开发微信功能
2018/06/13 Python
OpenCV+Python识别车牌和字符分割的实现
2019/01/31 Python
python 中Arduino串口传输数据到电脑并保存至excel表格
2019/10/14 Python
解决tensorflow添加ptb库的问题
2020/02/10 Python
python读取yaml文件后修改写入本地实例
2020/04/27 Python
HTML5混合开发二维码扫描以及调用本地摄像头
2017/12/27 HTML / CSS
世界著名的顶级牛排:Omaha Steak(奥马哈牛排)
2016/09/20 全球购物
serialVersionUID具有什么样的特征
2014/02/20 面试题
火车的故事教学反思
2014/02/11 职场文书
法务专员岗位职责
2015/02/14 职场文书
机器人瓦力观后感
2015/06/12 职场文书
pytorch 运行一段时间后出现GPU OOM的问题
2021/06/02 Python