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 spl_autoload_register实现自动加载研究
Dec 06 PHP
Erlang的运算符(比较运算符,数值运算符,移位运算符,逻辑运算符)
Jul 23 PHP
php适配器模式介绍
Aug 14 PHP
php ckeditor上传图片文件名乱码解决方法
Nov 15 PHP
ThinkPHP CURD方法之page方法详解
Jun 18 PHP
PHP中使用glob函数实现一句话删除某个目录下的所有文件
Jul 22 PHP
Ajax实现对静态页面的文章访问统计功能示例
Oct 10 PHP
PHP实现字符串翻转功能的方法【递归与循环算法】
Nov 03 PHP
php实现微信小程序授权登录功能(实现流程)
Nov 13 PHP
tp5框架基于ajax实现异步删除图片的方法示例
Feb 10 PHP
php查看一个变量的占用内存的实例代码
Mar 29 PHP
PHP反射基础知识回顾
Sep 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 和 MySQL 时区的一点总结
2008/03/26 PHP
php代码架构的八点注意事项
2016/01/25 PHP
PHP操作FTP类 (上传、下载、移动、创建等)
2016/03/31 PHP
PHP实现QQ快速登录的方法
2016/09/28 PHP
PHP实现笛卡尔积算法的实例讲解
2019/12/22 PHP
jquery插件珍藏(图片局部放大/信息提示框)
2013/01/08 Javascript
循环 vs 递归浅谈
2013/02/28 Javascript
AMD异步模块定义介绍和Require.js中使用jQuery及jQuery插件的方法
2014/06/06 Javascript
JavaScript设计模式经典之工厂模式
2016/02/24 Javascript
JavaScript的for循环中嵌套一个点击事件的问题解决
2017/03/03 Javascript
JS模拟实现ECMAScript5新增的数组方法
2017/03/20 Javascript
Angular.JS中指令ng-if的注意事项小结
2017/06/21 Javascript
谈谈JS中的!!
2017/12/07 Javascript
jQuery实现table表格checkbox全选的方法分析
2018/07/04 jQuery
vue代理和跨域问题的解决
2018/07/18 Javascript
vue实现的网易云音乐在线播放和下载功能案例
2019/02/18 Javascript
如何使用Javascript中的this关键字
2020/05/28 Javascript
antd 表格列宽自适应方法以及错误处理操作
2020/10/27 Javascript
JavaScript实现轮播图效果
2020/10/30 Javascript
Python数据结构之Array用法实例
2014/10/09 Python
python自动重试第三方包retrying模块的方法
2018/04/24 Python
详解opencv Python特征检测及K-最近邻匹配
2019/01/21 Python
在Python中使用Neo4j的方法
2019/03/14 Python
总结python 三种常见的内存泄漏场景
2020/11/20 Python
css3进行截取替代js的substring
2013/09/02 HTML / CSS
【HTML5】Canvas绘制简单图片教程
2016/05/13 HTML / CSS
计算s=f(f(-1.4))的值
2014/05/06 面试题
机电工程专业应届生求职信
2013/10/03 职场文书
业务主管岗位职责范本
2013/12/25 职场文书
省三好学生申请材料
2014/01/22 职场文书
护士进修自我鉴定
2014/02/07 职场文书
毕业典礼主持词大全
2014/03/26 职场文书
中国梦口号
2014/06/13 职场文书
清明节随笔
2015/08/15 职场文书
CSS实现渐变色边框(Gradient borders)的5种方法
2022/03/25 HTML / CSS
小程序自定义轮播图圆点组件
2022/06/25 Javascript