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程序中防止盗链
Apr 09 PHP
PHP 中文处理技巧
Apr 25 PHP
php设计模式 Proxy (代理模式)
Jun 26 PHP
php计算数组不为空元素个数的方法
Jan 27 PHP
thinkphp使用literal防止模板标签被解析的方法
Nov 22 PHP
ThinkPHP模型详解
Jul 27 PHP
PHP实现连接设备、通讯和发送命令的方法
Oct 13 PHP
PHP多维数组遍历方法(2种实现方法)
Dec 10 PHP
php实现scws中文分词搜索的方法
Dec 25 PHP
Yii中CArrayDataProvider和CActiveDataProvider区别实例分析
Mar 02 PHP
PHP网站自动化配置的实现方法(必看)
May 27 PHP
利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解
Aug 30 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中redis的用法深入解析
2014/02/20 PHP
ThinkPHP视图查询详解
2014/06/30 PHP
php实现的生成迷宫与迷宫寻址算法完整实例
2017/11/06 PHP
php实现的三个常用加密解密功能函数示例
2017/11/06 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
php分享朋友圈的实现代码
2019/02/18 PHP
Thinkphp整合阿里云OSS图片上传实例代码
2019/04/28 PHP
javascript 遍历验证所有文本框的值
2009/08/27 Javascript
jquery中$(#form :input)与$(#form input)的区别
2014/08/18 Javascript
jQuery弹出层插件Lightbox_me使用指南
2015/04/21 Javascript
jQuery ajax方法传递中文时出现中文乱码的解决方法
2016/07/25 Javascript
自学实现angularjs依赖注入
2016/12/20 Javascript
JavaScript实现大图轮播效果
2017/01/11 Javascript
Vue2.2.0+新特性整理及注意事项
2018/08/22 Javascript
JS中async/await实现异步调用的方法
2019/08/28 Javascript
vue element upload组件 file-list的动态绑定实现
2019/10/11 Javascript
node事件循环和process模块实例分析
2020/02/14 Javascript
详解Vue.js3.0 组件是如何渲染为DOM的
2020/11/10 Javascript
python分析apache访问日志脚本分享
2015/02/26 Python
理解Python垃圾回收机制
2016/02/12 Python
Python 读取指定文件夹下的所有图像方法
2018/04/27 Python
Django之模板层的实现代码
2019/09/09 Python
python  logging日志打印过程解析
2019/10/22 Python
纯css3实现的鼠标悬停动画按钮
2014/12/23 HTML / CSS
NFL欧洲商店(德国):NFL Europe Shop DE
2018/11/03 全球购物
招商业务员岗位职责
2013/12/16 职场文书
打架检讨书500字
2014/01/29 职场文书
优秀毕业生推荐信范文
2014/03/07 职场文书
养成教育经验材料
2014/05/26 职场文书
公司员工体检通知
2015/04/21 职场文书
投诉书范文
2015/07/02 职场文书
消防宣传语大全
2015/07/13 职场文书
学校中层领导培训心得体会
2016/01/11 职场文书
如何利用STAR法则制作留学文书?
2019/08/26 职场文书
tensorboard 可视化之localhost:6006不显示的解决方案
2021/05/22 Python
vue-cropper组件实现图片切割上传
2021/05/27 Vue.js