PHP 魔术方法 - __toString()

不知道大家在日常 PHP 编程中有没有发现,是不能直接用 echo 语句直接输出一个对象的,也不能用字符串连接符 ( . ) 拼接一个对象的,不信的话,请看下面的代码

<?php
class Person
{
    public $sex;
    public $name;
    public $age;

    public function __construct($name="",  $age=25, $sex='Male')
    {
        $this->name = $name;
        $this->age  = $age;
        $this->sex  = $sex;
    }
}

$person = new Person('Yufei',30,'Male');

echo $person;

'The Person is:' . $person;

会明显的报错

[yufei@localhost php]$ php demo.php 

Recoverable fatal error: Object of class Person could not be converted to string in /Users/yufei/php/demo.php on line 18

这是为什么呢 ? 因为我们没有给它 ( 实例的类 ) 定义一个将对象转换为字符串的方法。

PHP 有规定,如果要将一个对象转换为字符串,必须定义 __toString() 魔术方法

魔术方法 __toString()

当我们使用 echo 语句输出一个对象时,会自动检查一个对象有没有定义 _toString() 方法,如果定义了,就会输出 __toString() 方法的返回值,如果没有定义,那么会直接抛出一个异常,表明该对象不能直接转换为字符串

魔术方法 __toString() 的原型如下

public string __toString()
{
    // 将对象拼接成字符串的一些语句
}

该方法没有任何参数,也不会传递任何参数,但该方法必须有一个返回值,该返回值必须是字符串,且只能是字符串

范例

下面的范例,我们友好的将 Person 对象输出为字符串形式,以人类易阅读的格式

<?php
class Person
{
    public $sex;
    public $name;
    public $age;

    public function __construct($name="",  $age=25, $sex='Male')
    {
        $this->name = $name;
        $this->age  = $age;
        $this->sex  = $sex;
    }

    public function __toString()
    {
        return sprintf('Person("%s",%s,"%s")',$this->name,$this->age,$this->sex);
    }
}

$person = new Person('Yufei',30,'Male');

echo $person,"\n";

echo 'The Person is:' . $person, "\n";

运行结果如下

[yufei@localhost php]$ php demo.php 
Person("Yufei",30,"Male")
The Person is:Person("Yufei",30,"Male"
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.