_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也是一个不错的选择

PHP中的__toString方法(实现JS里的链式操作)的更多相关文章

  1. ThinkPHP 数据库操作(三) : 查询方法、查询语法、链式操作

    查询方法 条件查询方法 where 方法 可以使用 where 方法进行 AND 条件查询: Db::table('think_user') ->where('name','like','%th ...

  2. thinkphp5.1中使用链式操作的坑

    1.在进行tp5->tp5.1的时候,没有想太多,直接使用之前的代码:结果在该操作中,多次调用该get方法,tp5.1的链式操作一直保持了之前的搜索条件,截图如下:(具体的代码没有展示) 2.然 ...

  3. php类自动装载、链式操作、魔术方法

    1.自动装载实例 目录下有3个文件:index.php load.php tests文件夹 tests文件夹里有 test1.php <?php namespace Tests; class T ...

  4. js实现链式操作

    前言:前不久阿里远程面试时问了我一个问题,如下: function Person(){}; var person = new Person(); //实现person.set(10).get()返回2 ...

  5. js简单实现链式调用

    链式调用实现原理:对象中的方法执行后返回对象自身即可以实现链式操作.说白了就是每一次调用方法返回的是同一个对象才可以链式调用. js简单实现链式调用demo Object.prototype.show ...

  6. PHP实现链式操作的三种方法详解

    这篇文章主要介绍了PHP实现链式操作的三种方法,结合实例形式分析了php链式操作的相关实现技巧与使用注意事项,需要的朋友可以参考下 本文实例讲述了PHP实现链式操作的三种方法.分享给大家供大家参考,具 ...

  7. Laravel框架中的数据库CURD操作、连贯操作、链式操作的用法

    Laravel是一套简洁.优雅的PHP Web开发框架(PHP Web Framework).它可以让你从面条一样杂乱的代码中解脱出来:它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁.富于 ...

  8. jquery中链式操作的this指向

    jquery中链式操作是如何实现? 例如:$(obj).children().css('color','red').next().css('color','red').siblings().css(' ...

  9. C++中的链式操作

    代码编译环境:Windows7 32bits+VS2012. 1.什么是链式操作 链式操作是利用运算符进行的连续运算(操作).它的特点是在一条语句中出现两个或者两个以上相同的操作符,如连续的赋值操作. ...

随机推荐

  1. cookies,sessionStorage 和 localStorage区别

    cookies,sessionStorage 和 localStorage 的区别 cookie是网站为了标示用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密). cook ...

  2. sscanf_强大的数据读取-转换

    function <cstdio> sscanf int sscanf ( const char * s, const char * format, ...); Read formatte ...

  3. 把token带到 http头部 或者验证一下referer

    提交地址:http://baozoumanhua.com/users/8311358提交数据:-----------------------------195704664324Content-Disp ...

  4. Hbuilder开发HTML5 APP之向导页制作

    研究了下,向导页的制作还是比较简单的,主要使用的是mui控件中的”图片轮播“组件,组件的标签写法手册中有,中间发现个有趣的东西,如果要作全屏,可以加个样式mui-fullscreen 滑动图片时会自动 ...

  5. 剑指offer编程题java实现(正在更新)

    面试题三:查找二维数组中元素问题 public static void main(String[] args){ int[][] num = {{1,2,8,9},{2,4,9,12},{4,7,10 ...

  6. 你所不知道的JavaScript数组

    相信每一个 javascript 学习者,都会去了解 JS 的各种基本数据类型,数组就是数据的组合,这是一个很基本也十分简单的概念,他的内容没多少,学好它也不是件难事情.但是本文着重要介绍的并不是我们 ...

  7. Web前端开发工程师养成计划【转载】

    Web前端开发工程师养成计划(入门篇) 最原始的忠告:这个世界上有想法的人很多,但是有想法又能实现它的人太少! 首先要感谢伟大的Web2.0概念.产品概念.用户体验概念.jQuery插件,是它们在中国 ...

  8. MySQL 忘记root密码解决办法

    标签:root密码不为空 概述 很多时候mysql安装完root用户的默认密码不为空,这时候就需要通过其它办法登入到mysql重置密码. 步骤 方法1:查看/root/.mysql_secret文件 ...

  9. js框架模版

    (function() { //注册命名空间zzw到window对象上 window['zzw'] = {} //定义一个$函数 function $() { alert("hello $& ...

  10. 微冷的雨之Java中的多线程初理解(一)

    在讲解多线程前,我们必须理解什么是多线程?而且很多人都会将进程和线程做对比. 进程和线程 进程:进程是操作系统结构的基础,是一次程序的执行,是一个程序及其数据在处理机上顺序执行时所发生的活动,是程序在 ...