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计算两个路径的相对路径
Jun 14 PHP
php的一个简单加密解密代码
Jan 14 PHP
php生成缩略图示例代码分享(使用gd库实现)
Jan 20 PHP
PHP实现获取域名的方法小结
Nov 05 PHP
PHP中shuffle数组值随便排序函数用法
Nov 21 PHP
PHP中把对象数组转换成普通数组的方法
Jul 10 PHP
php 数组随机取值的简单实例
May 23 PHP
PHP安装GeoIP扩展根据IP获取地理位置及计算距离的方法
Jul 01 PHP
基于ThinkPHP实现的日历功能实例详解
Apr 15 PHP
Laravel框架使用Seeder实现自动填充数据功能
Jun 13 PHP
实现php删除链表中重复的结点
Sep 27 PHP
详解PHP多个进程配合redis的有序集合实现大文件去重
Mar 06 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
在smarty模板中使用PHP函数的方法
2011/04/23 PHP
PHP安全下载文件的方法
2016/04/07 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
2018/02/23 PHP
php中如何执行linux命令详解
2018/11/06 PHP
用JavaScript实现仿Windows关机效果
2007/03/10 Javascript
Javascript 函数中的参数使用分析
2010/03/27 Javascript
在jQuery 1.5中使用deferred对象的代码(翻译)
2011/03/10 Javascript
JS自动缩小超出大小的图片
2012/10/12 Javascript
js中widow.open()方法使用详解
2013/07/30 Javascript
Jquery实现控件的隐藏和显示实例
2014/02/08 Javascript
JS实现带圆弧背景渐变效果的导航菜单代码
2015/10/13 Javascript
javascript html实现网页版日历代码
2016/03/08 Javascript
springMVC结合AjaxForm上传文件
2016/07/12 Javascript
浅谈js中字符和数组一些基本算法题
2016/08/15 Javascript
详解nodejs 文本操作模块-fs模块(四)
2016/12/22 NodeJs
js和jquery中获取非行间样式
2017/05/05 jQuery
Angular 表单控件示例代码
2017/06/26 Javascript
vue-router配合ElementUI实现导航的实例
2018/02/11 Javascript
使用Vue做一个简单的todo应用的三种方式的示例代码
2018/10/20 Javascript
JS实现鼠标移动拖尾
2020/12/27 Javascript
[00:58]2016年国际邀请赛勇士令状宣传片
2016/06/01 DOTA
Android 兼容性问题:java.lang.UnsupportedOperationException解决办法
2017/03/19 Python
解决uWSGI的编码问题详解
2017/03/24 Python
用python的requests第三方模块抓取王者荣耀所有英雄的皮肤实例
2017/12/14 Python
Python实现的维尼吉亚密码算法示例
2018/04/12 Python
Python使用folium excel绘制point
2019/01/03 Python
Python Django框架单元测试之文件上传测试示例
2019/05/17 Python
Python3离线安装Requests模块问题
2019/10/13 Python
PYQT5开启多个线程和窗口,多线程与多窗口的交互实例
2019/12/13 Python
Python3 assert断言实现原理解析
2020/03/02 Python
python如何运行js语句
2020/09/09 Python
经济系大学生求职信
2013/10/01 职场文书
省优秀教师事迹材料
2014/01/30 职场文书
2016年综治和平安建设宣传月活动总结
2016/04/01 职场文书
导游词之苏州寒山寺
2019/12/05 职场文书
使用numpy nonzero 找出非0元素
2021/05/14 Python