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 危险函数全解析
Sep 09 PHP
PHPThumb PHP 图片缩略图库
Mar 11 PHP
PHPEXCEL 使用小记
Jan 06 PHP
基于php实现长连接的方法与注意事项的问题
May 10 PHP
深入解析PHP的引用计数机制
Jun 14 PHP
php 备份数据库代码(生成word,excel,json,xml,sql)
Jun 23 PHP
Drupal7连接多个数据库及常见问题解决
Mar 02 PHP
PHP简单实现“相关文章推荐”功能的方法
Jul 19 PHP
PHP基于socket实现的简单客户端和服务端通讯功能示例
Jul 10 PHP
Laravel框架文件上传功能实现方法示例
Apr 16 PHP
PHP基于swoole多进程操作示例
Aug 12 PHP
PHP判断一个变量是否为整数、正整数的方法示例
Sep 11 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
MySQL GBK→UTF-8编码转换
2007/05/24 PHP
Codeigniter操作数据库表的优化写法总结
2014/06/12 PHP
PHP实现简单登录界面
2019/10/23 PHP
PHP数组array类常见操作示例
2020/05/15 PHP
js切换div css注意的细节
2012/12/10 Javascript
jquery分割字符串的方法
2015/06/24 Javascript
Jquery ajax 同步阻塞引起的UI线程阻塞问题
2015/11/17 Javascript
跟我学习javascript的this关键字
2020/05/28 Javascript
Node.js中JavaScript操作MySQL的常用方法整理
2016/03/01 Javascript
Node.js和Express简单入门介绍
2017/03/24 Javascript
ES6中Class类的静态方法实例小结
2017/10/28 Javascript
Node.js搭建WEB服务器的示例代码
2018/08/15 Javascript
JS实现图片轮播效果实例详解【可自动和手动】
2019/04/04 Javascript
深入浅析golang zap 日志库使用(含文件切割、分级别存储和全局使用等)
2020/02/19 Javascript
JS Html转义和反转义(html编码和解码)的实现与使用方法总结
2020/03/10 Javascript
vue通过过滤器实现数据格式化
2020/07/20 Javascript
从零学Python之入门(三)序列
2014/05/25 Python
使用PDB简单调试Python程序简明指南
2015/04/25 Python
python绘图方法实例入门
2015/05/19 Python
python定时执行指定函数的方法
2015/05/27 Python
python实现批量下载新浪博客的方法
2015/06/15 Python
pandas DataFrame 根据多列的值做判断,生成新的列值实例
2018/05/18 Python
pandas中apply和transform方法的性能比较及区别介绍
2018/10/30 Python
Python多线程及其基本使用方法实例分析
2019/10/29 Python
pandas-resample按时间聚合实例
2019/12/27 Python
TensorFlow命名空间和TensorBoard图节点实例
2020/01/23 Python
Pycharm2020最新激活码|永久激活(附最新激活码和插件的详细教程)
2020/09/29 Python
农业项目建议书
2014/08/25 职场文书
先进班集体事迹材料
2014/12/25 职场文书
用Python监控你的朋友都在浏览哪些网站?
2021/05/27 Python
python实现A*寻路算法
2021/06/13 Python
聊一聊Redis与MySQL双写一致性如何保证
2021/06/26 Redis
KVM基础命令详解
2022/04/30 Servers
阿里云服务器Ubuntu 20.04上安装Odoo 15
2022/05/20 Servers
利用Python实现模拟登录知乎
2022/05/25 Python
volatile保证可见性及重排序方法
2022/08/05 Java/Android