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(7) php 字符串相关应用
Mar 05 PHP
PHP中include与require使用方法区别详解
Oct 19 PHP
网页上facebook分享功能具体实现
Jan 26 PHP
php可扩展的验证类实例(可对邮件、手机号、URL等验证)
Jul 09 PHP
WordPress开发中自定义菜单的相关PHP函数使用简介
Jan 05 PHP
joomla实现注册用户添加新字段的方法
May 05 PHP
[原创]php实现子字符串位置相互对调互换的方法
Jun 02 PHP
什么是PHP文件?如何打开PHP文件?
Jun 27 PHP
PHP操作MongoDB实现增删改查功能【附php7操作MongoDB方法】
Apr 24 PHP
php微信公众号开发之秒杀
Oct 20 PHP
php分享朋友圈的实现代码
Feb 18 PHP
统计PHP目录中的文件数方法
Mar 05 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
php实现监听事件
2013/11/06 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
2017/09/15 PHP
PHP实时统计中文字数和区别
2019/02/28 PHP
php 多继承的几种常见实现方法示例
2019/11/18 PHP
PHP 实现base64编码文件上传出现问题详解
2020/09/01 PHP
如何用javascript去掉字符串里的所有空格
2007/02/08 Javascript
js刷新框架子页面的七种方法代码
2008/11/20 Javascript
JavaScript 对Cookie 操作的封装小结
2009/12/31 Javascript
等待指定时间后自动跳转或关闭当前页面的js代码
2013/07/09 Javascript
网页实时显示服务器时间和javscript自运行时钟
2014/06/09 Javascript
浅谈document.write()输出样式
2015/05/07 Javascript
JS控制伪元素的方法汇总
2016/04/06 Javascript
浅析Bootstrap验证控件的使用
2016/06/23 Javascript
vue2.0安装style/css loader的方法
2018/03/14 Javascript
jQuery实现遍历XML节点和属性的方法示例
2018/04/29 jQuery
layui table表格数据的新增,修改,删除,查询,双击获取行数据方式
2019/11/14 Javascript
在JavaScript中查找字符串中最长单词的三种方法(推荐)
2021/01/18 Javascript
各个系统下的Python解释器相关安装方法
2015/10/12 Python
对python中类的继承与方法重写介绍
2019/01/20 Python
浅谈pandas筛选出表中满足另一个表所有条件的数据方法
2019/02/08 Python
python多进程读图提取特征存npy
2019/05/21 Python
Python with关键字,上下文管理器,@contextmanager文件操作示例
2019/10/17 Python
Python collections中的双向队列deque简单介绍详解
2019/11/04 Python
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
2019/11/25 Python
python程序需要编译吗
2020/06/19 Python
摩托车和ATV零件、配件和服装的首选在线零售商:MotoSport
2017/12/22 全球购物
老师自我鉴定范文
2013/12/25 职场文书
教师业务学习制度
2014/01/25 职场文书
党员创先争优公开承诺书
2014/03/28 职场文书
2014年社区国庆节活动方案
2014/09/16 职场文书
党员教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
2014年教育培训工作总结
2014/12/08 职场文书
焦裕禄纪念馆观后感
2015/06/09 职场文书
解决tk mapper 通用mapper的bug问题
2021/06/16 Java/Android
Python多线程 Queue 模块常见用法
2021/07/04 Python