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配置文件中最常用四个ini函数
Mar 19 PHP
PHP 强制性文件下载功能的函数代码(任意文件格式)
May 26 PHP
解析php中获取url与物理路径的总结
Jun 21 PHP
php获取网页标题和内容函数(不包含html标签)
Feb 03 PHP
PHP常用的缓存技术汇总
May 05 PHP
destoon实现调用图文新闻的方法
Aug 21 PHP
php限制上传文件类型并保存上传文件的方法
Mar 13 PHP
PHP Reflection API详解
May 12 PHP
适用于初学者的简易PHP文件上传类
Oct 29 PHP
Yii 2.0在Grid中格式化时间方法示例
Jun 06 PHP
thinkphp分页集成实例
Jul 24 PHP
php+websocket 实现的聊天室功能详解
May 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安全配置
2006/12/06 PHP
php ob_flush,flush在ie中缓冲无效的解决方法
2010/05/09 PHP
通过PHP current函数获取未知字符键名数组第一个元素的值
2013/06/24 PHP
图解找出PHP配置文件php.ini的路径的方法
2014/08/20 PHP
在WordPress中使用PHP脚本来判断访客来自什么国家
2015/12/10 PHP
html中table数据排序的js代码
2011/08/09 Javascript
javascript获得网页窗口实际大小的示例代码
2013/09/21 Javascript
js拖拽一些常见的思路方法整理
2014/03/19 Javascript
JavaScript中的依赖注入详解
2015/03/18 Javascript
详谈LABJS按需动态加载js文件
2015/05/07 Javascript
Javascript模仿淘宝信用评价实例(附源码)
2015/11/26 Javascript
前端微信支付js代码
2016/07/25 Javascript
BootStrop前端框架入门教程详解
2016/12/25 Javascript
理解javascript中的Function.prototype.bind的方法
2017/02/03 Javascript
jQuery获取单选按钮radio选中值与去除所有radio选中状态的方法
2017/05/20 jQuery
基于Require.js使用方法(总结)
2017/10/26 Javascript
Angular 数据请求的实现方法
2018/05/07 Javascript
解决webpack+Vue引入iView找不到字体文件的问题
2018/09/28 Javascript
angularJs中json数据转换与本地存储的实例
2018/10/08 Javascript
jQuery实现上下滚动公告栏详细代码
2018/11/21 jQuery
javascript中数组的常用算法深入分析
2019/03/12 Javascript
[38:40]2018DOTA2亚洲邀请赛 4.6淘汰赛 mineski vs LGD 第一场
2018/04/10 DOTA
python实现数据图表
2017/07/29 Python
Python中的is和==比较两个对象的两种方法
2017/09/06 Python
Python无损音乐搜索引擎实现代码
2018/02/02 Python
Python迭代器和生成器定义与用法示例
2018/02/10 Python
pandas的to_datetime时间转换使用及学习心得
2019/08/11 Python
python pip如何手动安装二进制包
2020/09/30 Python
为您搜罗全球潮流時尚品牌:HBX
2019/12/04 全球购物
TCP/IP的分层模型
2013/10/27 面试题
策划主管的工作职责
2013/11/24 职场文书
法人授权委托书
2014/04/03 职场文书
理财计划书
2014/08/14 职场文书
汽车服务工程专业自荐信
2014/09/02 职场文书
意外伤害赔偿协议书范本
2014/09/28 职场文书
学习群众路线的心得体会
2014/11/05 职场文书