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 相关文章推荐
提问的智慧(2)
Oct 09 PHP
PHP入门
Oct 09 PHP
自己前几天写的无限分类类
Feb 14 PHP
php操作JSON格式数据的实现代码
Dec 24 PHP
php下载文件源代码(强制任意文件格式下载)
May 09 PHP
php防止sql注入之过滤分页参数实例
Nov 03 PHP
ThinkPHP中处理表单中的注意事项
Nov 22 PHP
Yii中CGridView关联表搜索排序方法实例详解
Dec 03 PHP
php 升级到 5.3+ 后出现的一些错误,如 ereg(); ereg_replace(); 函数报错
Dec 07 PHP
谈谈PHP连接Access数据库的注意事项
Aug 12 PHP
Laravel 框架返回状态拦截代码
Oct 18 PHP
PHP+Mysql分布式事务与解决方案深入理解
Feb 27 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
PHP ajax 分页类代码
2008/11/13 PHP
用PHP读取flv文件的播放时间长度
2009/09/03 PHP
php读取3389的脚本
2014/05/06 PHP
Yii2实现ajax上传图片插件用法
2016/04/28 PHP
Yii框架数据模型的验证规则rules()被执行的方法
2016/12/02 PHP
PHP实现RTX发送消息提醒的实例代码
2017/01/03 PHP
php 如何设置一个严格控制过期时间的session
2017/05/05 PHP
用javascript实现的支持lrc歌词的播放器
2007/05/17 Javascript
jQuery插件的写法分享
2013/06/12 Javascript
jQuery仅用3行代码实现的显示与隐藏功能完整实例
2015/10/08 Javascript
高性能JavaScript循环语句和条件语句
2016/01/20 Javascript
使用Node.js处理前端代码文件的编码问题
2016/02/16 Javascript
详解JavaScript for循环中发送AJAX请求问题
2020/06/23 Javascript
基于jQuery的ajax方法封装
2016/07/14 Javascript
JS输出空格的简单实现方法
2016/09/08 Javascript
jQuery表单对象属性过滤选择器实例详解
2016/09/13 Javascript
Angular 1.x个人使用的经验小结
2017/07/19 Javascript
Vue中的ref作用详解(实现DOM的联动操作)
2017/08/21 Javascript
旺旺在线客服代码 旺旺客服代码生成器
2018/01/09 Javascript
微信小程序自定义modal弹窗组件的方法详解
2020/12/20 Javascript
[01:11:11]Alliance vs RNG 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
python选择排序算法的实现代码
2013/11/21 Python
Python2.x和3.x下maketrans与translate函数使用上的不同
2015/04/13 Python
Numpy 将二维图像矩阵转换为一维向量的方法
2018/06/05 Python
python实现pdf转换成word/txt纯文本文件
2018/06/07 Python
解决python调用自己文件函数/执行函数找不到包问题
2020/06/01 Python
迪梵英国官方网站:Darphin英国
2017/12/06 全球购物
市场营销专业推荐信
2013/11/03 职场文书
庆元旦广播稿
2014/02/10 职场文书
升国旗仪式主持词
2014/03/19 职场文书
知识竞赛主持词
2014/03/26 职场文书
2014学校领导四风问题对照检查材料思想汇报
2014/09/22 职场文书
县政府领导班子四风问题对照检查材料思想汇报
2014/09/26 职场文书
意向协议书
2015/01/27 职场文书
校车安全管理责任书
2015/05/11 职场文书
Python中22个万用公式的小结
2021/07/21 Python