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 相关文章推荐
PHP4实际应用经验篇(3)
Oct 09 PHP
php设计模式 Builder(建造者模式)
Jun 26 PHP
关于crontab的使用详解
Jun 24 PHP
php发送post请求函数分享
Mar 06 PHP
ThinkPHP查询返回简单字段数组的方法
Aug 25 PHP
php 批量查询搜狗sogou代码分享
May 17 PHP
PHP Yii框架之表单验证规则大全
Nov 16 PHP
php中的登陆login实例代码
Jun 20 PHP
功能强大的PHP发邮件类
Aug 29 PHP
一个非常实用的php文件上传类
Jul 04 PHP
laravel 框架结合关联查询 when()用法分析
Nov 22 PHP
PHP全局使用Laravel辅助函数dd
Dec 26 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
Gregarius中文日期格式问题解决办法
2008/04/22 PHP
ezSQL PHP数据库操作类库
2010/05/16 PHP
实用PHP会员权限控制实现原理分析
2011/05/29 PHP
定位地理位置PHP判断员工打卡签到经纬度是否在打卡之内
2019/05/23 PHP
一段多浏览器的&quot;复制到剪贴板&quot;javascript代码
2007/03/27 Javascript
JQuery 学习笔记 选择器之四
2009/07/23 Javascript
jQuery EasyUI API 中文文档 - Menu菜单
2011/10/03 Javascript
jquery ajax对特殊字符进行转义防止js注入使用示例
2013/11/21 Javascript
JS批量修改PS中图层名称的方法
2014/01/26 Javascript
jquery插件jquery.confirm弹出确认消息
2015/12/22 Javascript
js H5 canvas投篮小游戏
2016/08/18 Javascript
Javascript 实现全屏滚动实例代码
2016/12/31 Javascript
详解nodejs中express搭建权限管理系统
2017/09/15 NodeJs
nodejs+express搭建多人聊天室步骤
2018/02/12 NodeJs
详解vue-cli 2.0配置文件(小结)
2019/01/14 Javascript
微信小程序开发之左右分栏效果的实例代码
2019/05/20 Javascript
用Python计算三角函数之acos()方法的使用
2015/05/15 Python
Python批量按比例缩小图片脚本分享
2015/05/21 Python
Django中URL视图函数的一些高级概念介绍
2015/07/20 Python
Queue 实现生产者消费者模型(实例讲解)
2017/11/13 Python
Python实现的摇骰子猜大小功能小游戏示例
2017/12/18 Python
Python设计模式之工厂方法模式实例详解
2019/01/18 Python
基于Python函数和变量名解析
2019/07/19 Python
Python多线程爬取豆瓣影评API接口
2019/10/22 Python
信号生成及DFT的python实现方式
2020/02/25 Python
python实现逻辑回归的示例
2020/10/09 Python
使用HTML5 Canvas绘制直线或折线等线条的方法讲解
2016/03/14 HTML / CSS
HTML5 Canvas旋转动画的2个代码例子(一个旋转的太极图效果)
2014/04/10 HTML / CSS
美国室内盆栽植物购买网站:Plants.com
2020/04/24 全球购物
说一下mysql, oracle等常见数据库的分页实现方案
2012/09/29 面试题
什么是虚拟内存?虚拟内存有什么优势?
2016/02/09 面试题
优秀生推荐信范文
2013/11/28 职场文书
小学教师节活动方案
2014/01/31 职场文书
2014年售票员工作总结
2014/11/19 职场文书
检讨书格式
2019/04/25 职场文书
Apache Hudi的多版本清理服务彻底讲解
2022/03/31 Servers