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 相关文章推荐
解析:使用php mongodb扩展时 需要注意的事项
Jun 18 PHP
限制ckeditor上传图片文件大小的方法
Nov 15 PHP
使用PHP强制下载PDF文件示例
Jan 17 PHP
php简单定时执行任务的实现方法
Feb 23 PHP
php打造智能化的柱状图程序,用于报表等
Jun 19 PHP
php 把数字转换成汉字的代码
Jul 21 PHP
PHP实现的蚂蚁爬杆路径算法代码
Dec 03 PHP
PHP检测用户是否关闭浏览器的方法
Feb 14 PHP
支付宝服务窗API接口开发php版本
Jul 20 PHP
PHP实现QQ登录的开原理和实现过程
Feb 04 PHP
php+croppic.js实现剪切上传图片功能
Aug 14 PHP
PHP实现简易用户登录系统
Jul 10 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 结果集的分页实现代码
2009/03/10 PHP
PHP中array_merge和array相加的区别分析
2013/06/17 PHP
浅析PHP的静态成员函数效率更高的原因
2014/06/13 PHP
php使用cookie显示用户上次访问网站日期的方法
2015/01/26 PHP
php魔术方法功能与用法实例分析
2016/10/19 PHP
VBScript版代码高亮
2006/06/26 Javascript
屏蔽鼠标右键、Ctrl+n、shift+F10、F5刷新、退格键 的javascript代码
2007/04/01 Javascript
捕获关闭窗口的脚本
2009/01/10 Javascript
JavaScript使用指针操作实现约瑟夫问题实例
2015/04/07 Javascript
JavaScript截取指定长度字符串点击可以展开全部代码
2015/12/04 Javascript
一道JS前端闭包面试题解析
2015/12/25 Javascript
jQuery下拉框的简单应用
2016/06/24 Javascript
利用Javascript实现BMI计算器
2016/08/16 Javascript
ES6新特性之函数的扩展实例详解
2017/04/01 Javascript
详解SPA中前端路由基本原理与实现方式
2018/09/12 Javascript
使用微信SDK自定义分享的方法
2019/07/03 Javascript
[02:17]2016完美“圣”典风云人物:Sccc专访
2016/12/03 DOTA
python解析html开发库pyquery使用方法
2014/02/07 Python
python实现查询IP地址所在地
2015/03/29 Python
有趣的python小程序分享
2017/12/05 Python
python 对给定可迭代集合统计出现频率,并排序的方法
2018/10/18 Python
解决pycharm 误删掉项目文件的处理方法
2018/10/22 Python
flask-restful使用总结
2018/12/04 Python
python+mysql实现个人论文管理系统
2019/10/25 Python
Pytorch 实现计算分类器准确率(总分类及子分类)
2020/01/18 Python
基于python模拟bfs和dfs代码实例
2020/11/19 Python
Chantelle仙黛尔内衣美国官网:法国第一品牌内衣
2018/07/26 全球购物
MIXIT官网:俄罗斯最大的化妆品公司之一
2020/01/25 全球购物
第二层交换机和路由器的区别?第三层交换机和路由器的区别?
2013/05/23 面试题
专科毕业生求职简历的自我评价
2013/10/12 职场文书
幼儿园新年寄语
2014/04/03 职场文书
党支部换届选举方案
2014/05/08 职场文书
店长岗位职责
2015/02/11 职场文书
鲁冰花观后感
2015/06/10 职场文书
2016年教师学习教师法心得体会
2016/01/20 职场文书
关于python pygame游戏进行声音添加的技巧
2021/10/24 Python