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&amp;mysql(三)
Oct 09 PHP
php中的观察者模式
Mar 24 PHP
PHP中判断变量为空的几种方法小结
Nov 12 PHP
PHP APC缓存配置、使用详解
Mar 06 PHP
Codeigniter(CI)框架分页函数及相关知识
Nov 03 PHP
php异步多线程swoole用法实例
Nov 14 PHP
wordpress安装过程中遇到中文乱码的处理方法
Apr 21 PHP
Yii2超好用的日期和时间组件(值得收藏)
May 05 PHP
PHP排序算法之希尔排序(Shell Sort)实例分析
Apr 20 PHP
laravel框架使用阿里云短信发送消息操作示例
Feb 15 PHP
php设计模式之适配器模式实例分析【星际争霸游戏案例】
Apr 07 PHP
Yii使用EasyWechat实现小程序获取用户的openID的方法
Apr 29 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 iconv 函数转gb2312的bug解决方法
2009/10/11 PHP
php动态实现表格跨行跨列实现代码
2012/11/06 PHP
php的RSA加密解密算法原理与用法分析
2020/01/23 PHP
FCK调用方法..
2006/12/21 Javascript
jQuery Lightbox 图片展示插件使用说明
2010/04/25 Javascript
JS 图片缩放效果代码
2010/06/09 Javascript
50个比较实用jQuery代码段
2011/09/18 Javascript
jquery通过select列表选择框对表格数据进行过滤示例
2014/05/07 Javascript
Javascript 赋值机制详解
2014/11/23 Javascript
jquery实现点击页面计算点击次数
2015/01/23 Javascript
微信小程序 高德地图SDK详解及简单实例(源码下载)
2017/01/11 Javascript
手把手教你把nodejs部署到linux上跑出hello world
2017/06/19 NodeJs
详解JS中的柯里化(currying)
2017/08/17 Javascript
vue实现tab切换外加样式切换方法
2018/03/16 Javascript
p5.js实现动态图形临摹
2019/10/23 Javascript
JavaScript交换两个变量方法实例
2019/11/25 Javascript
JS通用方法触发点击事件代码实例
2020/02/17 Javascript
SpringBoot+Vue开发之Login校验规则、实现登录和重置事件
2020/10/19 Javascript
Nuxt pages下不同的页面对应layout下的页面布局操作
2020/11/05 Javascript
[01:33]PWL开团时刻DAY2-开雾与反开雾
2020/10/31 DOTA
深入解析Python中的__builtins__内建对象
2016/06/21 Python
基于循环神经网络(RNN)实现影评情感分类
2018/03/26 Python
python 读取视频,处理后,实时计算帧数fps的方法
2018/07/10 Python
python分布式计算dispy的使用详解
2019/12/22 Python
Python中logging日志记录到文件及自动分割的操作代码
2020/08/05 Python
css3学习之2D转换功能详解
2016/12/23 HTML / CSS
canvas学习总结三之绘制路径-线段
2019/01/31 HTML / CSS
Peter Alexander新西兰站:澳大利亚领先的睡衣设计师品牌
2016/12/10 全球购物
欧舒丹加拿大官网:L’Occitane加拿大
2017/10/29 全球购物
金融专业推荐信
2013/11/14 职场文书
行政部总经理岗位职责
2014/01/04 职场文书
《草虫的村落》教学反思
2016/02/20 职场文书
导游经典开场白——导游词
2019/04/17 职场文书
优胜劣汰,强者为王——读《鲁滨逊漂流记》有感
2019/08/15 职场文书
PyMongo 查询数据的实现
2021/06/28 Python
MybatisPlus EntityWrapper如何自定义SQL
2022/03/22 Java/Android