PHP中的__toString方法

_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日‘);

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

时间: 2024-10-13 11:28:51

PHP中的__toString方法的相关文章

PHP中的魔术方法:__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone and __autoload

1.__get.__set 这两个方法是为在类和他们的父类中没有声明的属性而设计的: __get( $property ) 当调用一个未定义的属性时访问此方法: __set( $property, $value ) 给一个未定义的属性赋值时调用: 这里的没有声明包括当使用对象调用时,访问控制为proteced,private的属性(即没有权限访问的属性). 2.__isset.__unset __isset( $property ) 当在一个未定义的属性上调用isset()函数时调用此方法: _

PHP中的魔术方法:__construct, __destruct , __call,__get, __set, __isset, __unset , __toString, __set,__clone and __autoload

1.__get.__set 这两个方法是为在类和他们的父类中没有声明的属性而设计的: __get( $property ) 当调用一个未定义的属性时访问此方法: __set( $property, $value ) 给一个未定义的属性赋值时调用: 这里的没有声明包括当使用对象调用时,访问控制为proteced,private的属性(即没有权限访问的属性). 2.__isset.__unset __isset( $property ) 当在一个未定义的属性上调用isset()函数时调用此方法: _

phpz中的魔术方法__call、__set、__get、__sleep、__invoke、__autoload、__construct、__destruct、__clone、__tostring、__callstatic

PHP5.3新增了一个叫做__invoke的魔术方法,这样在创建实例后,可以直接调用对象. class testClass { public function __invoke { print “hello world”; } } $n = new testClass; $n(); 执行结果为: hello world. 官方示例 class CallableClass { public function __invoke($x) { var_dump($x); } } $obj = new C

PHP中的面向对象OOP中的魔术方法

一.什么是魔术方法: PHP为我们提供了一系列用__开头的函数,这些函数无需自己手动调用,会在合适的时机自动调用,这类函数称为魔术函数.例如: function __construct(){} 在new一个新对象时自动调用此函数 二.PHP中都有那些魔术方法,以及它们的作用:1.__construct():构造函数,new对象时自动调用 eg: class Person{ public $name; public $age; function __construct($name,$age){ $

PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep

PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone and __autoload 1.__get.__set这两个方法是为在类和他们的父类中没有声明的属性而设计的__get( $property ) 当调用一个未定义的属性时访问此方法__set( $proper

php中常用魔术方法的举例

魔术方法是php面向对象特有的功能,并且有时候能实现意想不到的效果,包括前面提到的构造函数.析构函数.还有__clone函数,另外再简单的介绍几个: 1.__toSring和__invoke 1 class Moshu{ 2 public function __tostring(){ 3 return "This is the Class MagicTest.<br />"; 4 } 5 public function __invoke($x){ 6 echo "

PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toStr

PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toStr PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_

php 中的魔术方法-----“事件方法”

来源:http://lornajane.net/posts/2012/phps-magic-__invoke-method-and-the-callable-typehint php 中的这个对象 ,有时间研究一下: PHP中会有一些魔术方法:PHP 将所有以 __(两个下划线)开头的类方法保留为魔术方法.所以在定义类方法时,除了上述魔术方法,建议不要以 __ 为前缀. 魔术方法有:__construct(), __destruct(), __call(), __callStatic(), __

【转】PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toStr

PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone and __autoload 1.__get.__set这两个方法是为在类和他们的父类中没有声明的属性而设计的__get( $property ) 当调用一个未定义的属性时访问此方法__set( $proper