_toString方法是在打印对象时自动调用的魔术方法,如果不声明会报以下错

Catchable fatal error: Object of class String could not be converted to 

示例:

PHP里有很多的字符串函数,假如要先过滤字符首尾的空格,再求出字符串的长度,一般会这么写:
strlen(trim($str));
如果要实现JS里的链式操作,比如像下面这样,应该怎么实现?
$str->trim()->strlen()
很简单,先实现一个String类,对这个类的对象调用方法进行处理时,触发__call魔术方法,接着执行call_user_func或者call_user_func_array即可.
以下是简单的实现

<?php
class String
{public $value;//字符串的值public function __construct($str){$this->value = $str;}public function __call($method, $args){array_push($args,$this->value);$this->value = call_user_func_array($method,$args);return $this;}//打印对象时返回对象的value值public function __toString(){return  strval($this->value);}
}
$str = new String('20150816');
echo $str->trim()->strtotime()->date('Y年m月d日');

运行结果如下

2015年08月16日

PHP的__toString魔术方法的设计原型来源于Java,Java中也有这么一个方法,而且在Java中,这个方法被大量使用,对于调试程序比较方便. 实际上,__toString方法也是一种序列化, PHP自带的serialize/unserialize也是进行序列化的, 但是这组函数序列化时会产生一些无用信息,如属性字符串长度,造成存储空间无谓浪费.因此,可以实现自己的序列化和反序列化方法,或者json_encode/json_decode也是一个不错的选择

转载于:https://www.cnblogs.com/chenqionghe/p/4735720.html

PHP中的__toString方法(实现JS里的链式操作)相关推荐

  1. Php 链式执行,PHP实现链式操作的三种方法详解

    本文实例讲述了PHP实现链式操作的三种方法.分享给大家供大家参考,具体如下: 在php中有很多字符串函数,例如要先过滤字符串收尾的空格,再求出其长度,一般的写法是: strlen(trim($str) ...

  2. php框架中数据库模型层原理,简单模拟ThinkPHP框架模型层对数据库的链式操作-Go语言中文社区...

    在接口被实例化以后的每个方法中return 类本身就可以达到链式操作. 改善了写多行代码执行一次操作的缺点. 下面请看我的代码,若有疑问,请留言给我. class Instance{ public s ...

  3. jquery中的map()方法与js中的map()方法

    1.jquery中的map()方法 首先看一个简单的实例: $("p").append( $("input").map(function(){ return $ ...

  4. 【js】数组链式组合方法

    [准备工作] 一个小练习吧 数组是我们最常用的数据结构之一,JS里原生自带的数组方法我们都要学习和了解,有助于提高我们的开发效率.这个小练习适用的地方挺多的,对常见的多维js数组方法应该会对你有所启发 ...

  5. Web APIs /APIs --DOM简述/DOM中获取元素方法/事件(含鼠标事件)/操作(含案例)

    Web APIs Web APIs 和 JS 的关联性: Web APIs是 W3C 组织的标准,主要学习DOM 和 BOM Web APIs是 JS 所独有的部分 主要学习页面交互功能 Web AP ...

  6. C#中Listobject.Clear()方法和实例化new Listobject()操作的结果分析

    本文主要的目的是想简单的探讨一下C#中List针对内存的操作过程,以便以后遇到该种情况可以避免走进误区,内容非常简单,只是在此作为记录.能帮到人最好,帮不到就当给自己提个醒.C#将复杂的指针操作全都隐 ...

  7. python find的使用方法_Python中的rfind()方法使用详解

    Python中的rfind()方法使用详解 rfind()方法返回所在子str 被找到的最后一个索引,或者-1,如果没有这样的索引不存在,可选择限制搜索字符串string[beg:end]. 语法 以 ...

  8. JavaScript中函数和方法区别

    相对于其他的编程语言,JavaScript可能是一个奇行种.其中我觉得最有必要提到的是JS中函数与方法的差异. 早期的JS中并没有真正意义上的方法的概念,所谓的方法只是用JS通过this对上下文做出特 ...

  9. thinkadmin中的一些方法使用

    thinkadmin 1.最开始接触thinkadmin时一头雾水,官方文档太简洁,所以现在记录部分功能: 1.thinkadmin是一个基于thinkphp和layui的部分开发框架 2.后端,Li ...

最新文章

  1. 【数据结构】顺序栈的实现(C语言)
  2. GOPROXY环境变量中direct的含义与用途
  3. 无失真压缩法可以减少冗余_混音笔记(七)——压缩器(2)压缩器参数调节方法...
  4. 最简洁的js鼠标拖曳效果【原】
  5. jsoup 简单应用
  6. linux中sleep详解实例
  7. mysql 报错跳过_mysql跳过主从同步错误
  8. HBase 的(伪)分布式安装
  9. MVVM后,下一代开发模式在哪?
  10. 游戏修改服务器数据,修改游戏服务器数据的教程
  11. window计算机截屏快捷键,电脑截图是ctrl加什么键win7快捷键截图方法详解
  12. Markdown文件的标题分级自动编号——Typora
  13. 什么是商业智能 (BI) 仪表板?
  14. 显示器还有卖的吗_显示器不够好,你确定修的片能好看? | 摄影早自习第1365天...
  15. 用户角色及权限管理设计实例(基于RBAC模型)
  16. esxi硬盘分区格式_esxi4.1使用IDE格式磁盘
  17. TIOBE 8 月编程语言排行榜:没有一门语言能比得上 Python
  18. Rvalue References
  19. Migrating data of Redis
  20. u-boot下s29gl128p的调试

热门文章

  1. python 控制有线网卡_Python 使用指定的网卡发送HTTP请求的实例
  2. wxpython界面切换_wxpython实现按钮切换界面的方法
  3. mysql error 变量_mysql 变量问题
  4. 去重 属性_面试中常问的List去重问题,你都答对了吗?
  5. hbase hyperbase 区别_大数据之HBase的几个常规性问题
  6. 螺旋桨设计软件_欧洲斥巨资研发的A400M螺旋桨运输机,为啥就没人买啊?| 图说...
  7. sdi转hdmi转换器应用领域及规格参数详解
  8. 光端机与光纤收发器的区别
  9. 4G物联网网关和工业路由器的区别
  10. 【渝粤教育】国家开放大学2018年秋季 1063t现代货币金融学说 参考试题