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"