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 相关文章推荐
smarty静态实验表明,网络上是错的~呵呵
Nov 25 PHP
PHP 图片上传实现代码 带详细注释
Apr 29 PHP
php笔记之:AOP的应用
Apr 24 PHP
php file_get_contents抓取Gzip网页乱码的三种解决方法
Nov 12 PHP
php给一组指定关键词添加span标签的方法
Mar 31 PHP
PHP中ID设置自增后不连续的原因分析及解决办法
Aug 21 PHP
PHP上传图片时判断上传文件是否为可用图片的方法
Oct 20 PHP
Thinkphp框架 表单自动验证登录注册 ajax自动验证登录注册
Dec 27 PHP
ThinkPHP框架使用redirect实现页面重定向的方法实例分析
Apr 12 PHP
PHP如何根据文件头检测文件类型实例代码
Oct 14 PHP
Yii框架使用PHPExcel导出Excel文件的方法分析【改进版】
Jul 24 PHP
PHP-FPM 设置多pool及配置文件重写操作示例
Oct 02 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 _autoload自动加载类与机制分析
2012/02/10 PHP
解析CodeIgniter自定义配置文件
2013/06/18 PHP
PHP header()函数常用方法总结
2014/04/11 PHP
php防止网站被攻击的应急代码
2015/10/21 PHP
thinkphp5框架实现的自定义扩展类操作示例
2019/05/16 PHP
PHP 并发场景的几种解决方案
2019/06/14 PHP
Code: write(s,d) 输出连续字符串
2007/08/19 Javascript
js输出列表实现代码
2010/09/12 Javascript
js对象的构造和继承实现代码
2010/12/05 Javascript
jquery实现图片渐变切换兼容ie6/Chrome/Firefox
2013/08/02 Javascript
js下拉菜单语言选项简单实现
2013/09/23 Javascript
javascript实现客户端兼容各浏览器创建csv并下载的方法
2015/03/23 Javascript
JavaScript实现为指定对象添加多个事件处理程序的方法
2015/04/17 Javascript
Javascript中Promise的四种常用方法总结
2017/07/14 Javascript
js实现轮播图效果 z-index实现轮播图
2020/01/17 Javascript
JS数组reduce()方法原理及使用技巧解析
2020/07/14 Javascript
Vue在H5 项目中使用融云进行实时个人单聊通讯
2020/12/14 Vue.js
安装dbus-python的简要教程
2015/05/05 Python
浅谈Python的Django框架中的缓存控制
2015/07/24 Python
Python调用SQLPlus来操作和解析Oracle数据库的方法
2016/04/09 Python
python3读取MySQL-Front的MYSQL密码
2017/05/03 Python
Python下实现的RSA加密/解密及签名/验证功能示例
2017/07/17 Python
pygame实现雷电游戏雏形开发
2018/11/20 Python
python爬虫selenium和phantomJs使用方法解析
2019/08/08 Python
python画蝴蝶曲线图的实例
2019/11/21 Python
python求前n个阶乘的和实例
2020/04/02 Python
澳大利亚儿童精品仓库:Goo & Co.
2019/06/20 全球购物
函授本科自我鉴定
2013/11/03 职场文书
《北京的春节》教学反思
2014/04/07 职场文书
动画设计系毕业生求职信
2014/07/15 职场文书
2014年人民警察入党思想汇报
2014/10/12 职场文书
四风批评与自我批评发言稿
2014/10/14 职场文书
2016元旦晚会主持词开场白和结束语
2015/12/04 职场文书
Python爬虫之爬取二手房信息
2021/04/27 Python
golang 如何用反射reflect操作结构体
2021/04/28 Golang
浅谈Python实现opencv之图片色素的数值运算和逻辑运算
2021/06/23 Python