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 session有效期问题
Apr 26 PHP
WordPress判断用户是否登录的代码
Mar 17 PHP
Php Ctemplate引擎开发相关内容
Mar 03 PHP
php函数间的参数传递(值传递/引用传递)
Sep 23 PHP
PHP实现UTF-8文件BOM自动检测与移除实例
Nov 05 PHP
php实现模拟post请求用法实例
Jul 11 PHP
ThinkPHP设置禁止百度等搜索引擎转码(简单实用)
Feb 15 PHP
PHP生成制作验证码的简单实例
Jun 12 PHP
PHP入门教程之上传文件实例详解
Sep 11 PHP
yii2项目实战之restful api授权验证详解
May 20 PHP
PHP检查网站是否宕机的方法示例
Jul 24 PHP
tp5框架使用cookie加密算法实现登录功能示例
Feb 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实现的树形结构数据存取类实例
2014/11/29 PHP
PHP统计数值数组中出现频率最多的10个数字的方法
2015/04/20 PHP
传智播客学习之java 反射
2009/11/22 Javascript
按Enter键触发事件的jquery方法实现代码
2014/02/17 Javascript
javascript学习笔记(一)基础知识
2014/09/30 Javascript
javascript获取当前鼠标坐标的方法
2015/01/10 Javascript
AngularJS使用ngMessages进行表单验证
2015/12/27 Javascript
pc加载更多功能和移动端下拉刷新加载数据
2016/11/07 Javascript
通过修改360抢票的刷新频率和突破8车次限制实现方法
2017/01/04 Javascript
JavaScript数据结构之二叉树的查找算法示例
2017/04/13 Javascript
Vue自定义指令使用方法详解
2017/08/21 Javascript
js + css实现标签内容切换功能(实例讲解)
2017/10/09 Javascript
CSS3 动画卡顿性能优化的完美解决方案
2018/09/20 Javascript
vue中promise的使用及异步请求数据的方法
2018/11/08 Javascript
详解使用JWT实现单点登录(完全跨域方案)
2019/08/02 Javascript
微信小程序JS加载esmap地图的实例详解
2019/09/04 Javascript
Javascript实现鼠标移入方向感知
2020/06/24 Javascript
[29:10]Ti4 冒泡赛第二天 NEWBEE vs Titan 3
2014/07/15 DOTA
python在windows下实现ping操作并接收返回信息的方法
2015/03/20 Python
进一步理解Python中的函数编程
2015/04/13 Python
python访问系统环境变量的方法
2015/04/29 Python
Django REST framework视图的用法
2019/01/16 Python
如何使用Python进行OCR识别图片中的文字
2019/04/01 Python
Python中psutil的介绍与用法
2019/05/02 Python
使用Python自动生成HTML的方法示例
2019/08/06 Python
基于python调用jenkins-cli实现快速发布
2020/08/14 Python
HTML5 Canvas——用路径描画线条实例介绍
2013/06/09 HTML / CSS
为智能设备设计个性化保护套网站:caseable
2017/01/05 全球购物
中国汽车租赁行业头部企业:一嗨租车
2019/05/16 全球购物
俄罗斯品牌服装和鞋子在线商店:BRIONITY
2020/03/26 全球购物
使用C#编写创建一个线程的代码
2013/01/22 面试题
平面网站制作专科生的自我评价分享
2013/12/11 职场文书
女儿十岁生日答谢词
2014/01/27 职场文书
2015年中学图书馆工作总结
2015/07/22 职场文书
分布式锁为什么要选择Zookeeper而不是Redis?看完这篇你就明白了
2021/05/21 Redis
大型强子对撞机再次重启探索“第五种自然力”
2022/04/29 数码科技