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 has encountered an Access Violation 错误的解决方法
Jan 17 PHP
thinkPHP的Html模板标签使用方法
Nov 13 PHP
php读取EXCEL文件 php excelreader读取excel文件
Dec 06 PHP
深入php常用函数的使用汇总
Jun 08 PHP
PHP中file_exists函数不支持中文名的解决方法
Jul 26 PHP
PHP准确取得服务器IP地址的方法
Jun 02 PHP
ThinkPHP开发框架函数详解:C方法
Aug 14 PHP
利用PHP判断文件是否为图片的方法总结
Jan 06 PHP
WHOOPS PHP调试库的使用
Sep 29 PHP
thinkPHP框架实现多表查询的方法
Jun 14 PHP
PHP上传图片到数据库并显示的实例代码
Dec 20 PHP
php操作redis数据库常见方法实例总结
Feb 20 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
学习discuz php 引入文件的方法DISCUZ_ROOT
2009/06/21 PHP
php class中public,private,protected的区别以及实例分析
2013/06/18 PHP
javascript prototype 原型链
2009/03/12 Javascript
javascript 简练的几个函数
2009/08/29 Javascript
鼠标右击事件代码(asp.net后台)
2011/01/27 Javascript
javascript阻止scroll事件多次执行的思路及实现
2013/11/08 Javascript
使用jquery.upload.js实现异步上传示例代码
2014/07/29 Javascript
第一章之初识Bootstrap
2016/04/25 Javascript
AngularJS 视图详解及示例代码
2016/08/17 Javascript
JavaScript实现页面无操作倒计时退出
2016/10/22 Javascript
AngularJS辅助库browserTrigger用法示例
2016/11/03 Javascript
js实现图片旋转 js滚动鼠标中间对图片放大缩小
2017/07/05 Javascript
解决Vue 通过下表修改数组,页面不渲染的问题
2018/03/08 Javascript
js中split()方法得到的数组长度问题
2018/07/19 Javascript
JavaScript函数apply()和call()用法与异同分析
2018/08/10 Javascript
JS数组求和的常用方法实例小结
2019/01/07 Javascript
VSCode插件安装完成后的配置(常用配置)
2020/08/24 Javascript
python中的函数用法入门教程
2014/09/02 Python
Python使用gensim计算文档相似性
2016/04/10 Python
python中的错误处理
2016/04/10 Python
详解python的几种标准输出重定向方式
2016/08/15 Python
Python实现查看系统启动项功能示例
2018/05/10 Python
wxPython的安装与使用教程
2018/08/31 Python
详解python项目实战:模拟登陆CSDN
2019/04/04 Python
一个可以套路别人的python小程序实例代码
2019/04/09 Python
linux环境下Django的安装配置详解
2019/07/22 Python
Python 找出英文单词列表(list)中最长单词链
2020/12/14 Python
英国高端食品和葡萄酒超市:Waitrose
2016/08/23 全球购物
小学教师的自我评价范例
2013/10/31 职场文书
2014年村支部书记四风对照检查材料思想汇报
2014/10/02 职场文书
2014年服务行业工作总结
2014/11/18 职场文书
承诺书范本
2015/01/21 职场文书
初中物理教学反思
2016/02/19 职场文书
MySQL插入数据与查询数据
2022/03/25 MySQL
部分武汉产收音机展览
2022/04/07 无线电
Python开发五子棋小游戏
2022/05/02 Python