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 getsiteurl()函数
Sep 05 PHP
解析:php调用MsSQL存储过程使用内置RETVAL获取过程中的return值
Jul 03 PHP
php设计模式之命令模式使用示例
Mar 02 PHP
async和DOM Script文件加载比较
Jul 20 PHP
PHP return语句的另一个作用
Jul 30 PHP
PHP表单提交后引号前自动加反斜杠的原因及三种办法关闭php魔术引号
Sep 30 PHP
php好代码风格的阶段性总结
Jun 25 PHP
PHP实现简单ajax Loading加载功能示例
Dec 28 PHP
Yii2实现增删改查后留在当前页的方法详解
Jan 13 PHP
PHP基于redis计数器类定义与用法示例
Feb 08 PHP
tp框架(thinkPHP)实现三次登陆密码错误之后锁定账号功能示例
May 24 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
Feb 22 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
桌面中心(四)数据显示
2006/10/09 PHP
php获取数组元素中头一个数组元素值的实现方法
2014/12/20 PHP
PHP实现GIF图片验证码
2015/11/04 PHP
PHP实现可精确验证身份证号码的工具类示例
2018/05/31 PHP
laravel 模型查询按照whereIn排序的示例
2019/10/16 PHP
JQuery获取浏览器窗口内容部分高度的代码
2012/02/24 Javascript
jQuery中hide()方法用法实例
2014/12/24 Javascript
JavaScript中的数组特性介绍
2014/12/30 Javascript
JavaScript使用setInterval()函数实现简单轮询操作的方法
2015/02/02 Javascript
js操作css属性实现div层展开关闭效果的方法
2015/05/11 Javascript
如何屏蔽防止别的网站嵌入框架代码
2015/08/24 Javascript
JQuery入门基础小实例(1)
2015/09/17 Javascript
学习JavaScript设计模式之责任链模式
2016/01/18 Javascript
AngularJS实现ajax请求的方法
2016/11/22 Javascript
Vue应用部署到服务器的正确方式
2017/07/15 Javascript
vue3.0 CLI - 1 - npm 安装与初始化的入门教程
2018/09/14 Javascript
vscode 开发Vue项目的方法步骤
2018/11/25 Javascript
JS函数节流和防抖之间的区分和实现详解
2019/01/11 Javascript
JS实现继承的几种常用方式示例
2019/06/22 Javascript
vue项目中实现缓存的最佳方案详解
2019/07/11 Javascript
jQuery实现轮播图效果demo
2020/01/11 jQuery
es6中Promise 对象基本功能与用法实例分析
2020/02/23 Javascript
Python读取环境变量的方法和自定义类分享
2014/11/22 Python
Python递归遍历列表及输出的实现方法
2015/05/19 Python
使用Python搭建虚拟环境的配置方法
2018/02/28 Python
教你使用python实现微信每天给女朋友说晚安
2018/03/23 Python
如何基于Python创建目录文件夹
2019/12/31 Python
HTML5 新事件 小结
2009/07/16 HTML / CSS
MySQL面试题
2014/01/12 面试题
ShellScript面试题一则-ShellScript编程
2014/03/05 面试题
在职研究生自我鉴定
2013/10/16 职场文书
学校十一活动方案
2014/02/01 职场文书
关于运动会的广播稿50字
2014/10/17 职场文书
2016年小学植树节活动总结
2016/03/16 职场文书
JAVA 线程池(池化技术)的实现原理
2022/04/28 Java/Android
详解Spring Security如何在权限中使用通配符
2022/06/28 Java/Android