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 相关文章推荐
一个程序下载的管理程序(二)
Oct 09 PHP
php include,include_once,require,require_once
Sep 05 PHP
php中url函数介绍及使用示例
Feb 13 PHP
PHP实现将HTML5中Canvas图像保存到服务器的方法
Nov 28 PHP
php使用pdo连接mssql server数据库实例
Dec 25 PHP
PHP实现删除字符串中任何字符的函数
Aug 11 PHP
Zend Framework数据库操作方法实例总结
Dec 11 PHP
PHP中一个有趣的preg_replace函数详解
Aug 15 PHP
PHP实现负载均衡的加权轮询方法分析
Aug 22 PHP
asp函数split()对应php函数explode()
Feb 27 PHP
php7新特性的理解和比较总结
Apr 14 PHP
php中目录操作opendir()、readdir()及scandir()用法示例
Jun 08 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
Mysql的GROUP_CONCAT()函数使用方法
2008/03/28 PHP
php实现在多维数组中查找特定value的方法
2015/07/29 PHP
使用PHP免费发送定时短信的实例
2016/10/24 PHP
JQuery自定义事件的应用 JQuery最佳实践
2010/08/01 Javascript
深入理解JavaScript中的对象
2015/06/04 Javascript
javascript编写贪吃蛇游戏
2015/07/07 Javascript
jquery弹出遮掩层效果【附实例代码】
2016/04/28 Javascript
JS实现复制内容到剪贴板功能兼容所有浏览器(推荐)
2016/06/17 Javascript
微信小程序  modal详解及实例代码
2016/11/09 Javascript
Bootstrap Modal对话框如何在关闭时触发事件
2016/12/02 Javascript
javascript 中设置window.location.href跳转无效问题解决办法
2017/02/09 Javascript
Angularjs 与 bower安装和使用详解
2017/05/11 Javascript
javascript实现函数柯里化与反柯里化过程解析
2019/10/08 Javascript
layui 解决form表单点击无反应的问题
2019/10/25 Javascript
[01:51]DAC趣味视频-如何成为职业选手.mp4
2017/04/02 DOTA
[45:59]EG vs OG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
[37:45]完美世界DOTA2联赛PWL S3 LBZS vs Phoenix 第二场 12.09
2020/12/11 DOTA
python利用urllib实现爬取京东网站商品图片的爬虫实例
2017/08/24 Python
Python实现的人工神经网络算法示例【基于反向传播算法】
2017/11/11 Python
Python3实现转换Image图片格式
2018/06/21 Python
opencv与numpy的图像基本操作
2019/03/08 Python
Python玩转加密的技巧【推荐】
2019/05/13 Python
Python3 + Appium + 安卓模拟器实现APP自动化测试并生成测试报告
2021/01/27 Python
HTML5拖放效果的实现代码
2016/11/17 HTML / CSS
高中地理教学反思
2014/01/29 职场文书
婚前协议书
2014/04/15 职场文书
小学生手册家长评语
2014/04/16 职场文书
高中教师先进事迹材料
2014/08/22 职场文书
中级会计大学生职业生涯规划书
2014/09/16 职场文书
机关作风建设自查报告及整改措施
2014/10/21 职场文书
2015年个人实习工作总结
2014/12/12 职场文书
大足石刻导游词
2015/02/02 职场文书
民事调解书范文
2015/05/20 职场文书
毕业实习单位意见
2015/06/04 职场文书
教师节简报
2015/07/20 职场文书
聊一聊Redis与MySQL双写一致性如何保证
2021/06/26 Redis