__toString()方法

__toString()方法

打印一个对象时,如果定义了__toString()方法,就能在测试时,通过echo打印对象体,对象就会自动调用它所属类定义的toString方法,格式化输出这个对象所包含的数据。如果没有这个方法,那么echo一个对象时,就会报错Object of class Account could not be converted to string,实际上这是一个类型匹配失败的错误。不过仍然可以用print_r()var_dump()函数输出一个对象。当然__toString()是可以定制的,所提供的信息和样式更加丰富。

例如:

<?php

class Account
{
    public $user = 1;
    private $pwd = 2;

    //自定义的格式化输出方法
    public function __toString()
    {
        return "当前对象的用户名是$this->user,密码是$this->user";
    }
}

$a = new Account();
echo $a;

运行结果为:

当前对象的用户名是1,密码是1

如果使用var_dump($a)的运行结果为:

object(Account)#1 (2) { ["user"]=> int(1) ["pwd":"Account":private]=> int(2) } 

运行这段代码发现,使用toString方法后,输出结果是可定制的,更易于理解。实际上,toString方法也是一种序列化,PHP自带的serializeunserialize也是进行序列化的,但是这组函数序列化时会产生一些无用信息,如属性字符串长度,造成存储空间的额浪费。因此,可以实现自己的序列化和反序列化方法,或者json_encode/json_decode也是一个不错的选择。

机制解析:

为什么直接echo一个对象就会报语法错误,而如果这个对象实现了__toString()方法后就可以直接输出呢?

原因很简单,echo本来可以打印一个对象,而且实现了这个接口,但是PHP对其做了限制,只有实现toString后才允许使用。从下面的PHP源代码可以得到验证。

php源码

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值