我理解它是如何工作的,但为什么我们会实际使用它?
<?php
class cat {
public function __toString() {
return "This is a cat\n";
}
}
$toby = new cat;
print $toby;
?>
这不是这个:
<?php
class cat {
public function random_method() {
echo "This is a cat\n";
}
}
$toby = new cat;
$toby->random_method();
?>
我们不能只使用任何其他公共方法输出任何文字吗? 为什么我们需要像这样的魔法?
答案 0 :(得分:15)
你不需要它。但是定义它可以将对象隐式转换为字符串,这很方便。
具有echo
直接的成员函数被认为是不良形式,因为它对类本身的输出提供了太多控制。您希望从成员函数返回字符串,并让调用者决定如何处理它们:是将它们存储在变量中,还是将它们echo
出来,或者其他什么。使用魔术函数意味着您不需要显式函数调用来执行此操作。
答案 1 :(得分:12)
除了所有现有答案之外,还有一个例子:
class Assets{
protected
$queue = array();
public function add($script){
$this->queue[] = $script;
}
public function __toString(){
$output = '';
foreach($this->queue as $script){
$output .= '<script src="'.$script.'"></script>';
}
return $output;
}
}
$scripts = new Assets();
这是一个简单的类,可以帮助您管理javascripts。您可以通过调用$scripts->add('...')
来注册新脚本。
然后处理队列并打印所有已注册的脚本,只需拨打print $scripts;
。
显然,这个类在这种形式下是没有意义的,但是如果你实现资产依赖,版本控制,检查重复包含等等,它开始有意义(example)。
基本思想是这个对象的主要目的是创建一个字符串(HTML),所以在这种情况下使用__toString很方便......
答案 2 :(得分:5)
这只是一种生成对象字符串表示的标准化方法。如果假设程序中的所有对象都使用相同的方法,则random_method
方法有效,如果使用第三方库,则可能不是这种情况。
你不需要魔术方法,但它提供了方便,因为你永远不必真正地调用它。
此外,如果PHP内部要将对象转换为文本,它就知道如何做到这一点。
答案 3 :(得分:4)
__toString()
或echo()
)时,如果它的上下文是一个字符串,则会调用 print()
。由于对象不是字符串,__toString()
处理对象到某些字符串表示的转换。
答案 4 :(得分:3)
__toString方法允许类决定当它被视为字符串时它将如何反应
http://www.php.net/manual/en/language.oop5.magic.php#language.oop5.magic.tostring
答案 5 :(得分:1)
__toString
允许您在将对象转换为字符串时定义输出。这意味着您可以print
对象本身,而不是函数的返回值。这通常更方便。请参阅the manual entry。
答案 6 :(得分:1)
__ String帮助我们在构造函数中出现错误的情况下返回错误消息。
下面的伪代码将更好地阐明它。如果创建对象失败,则会发送错误字符串:
class Human{
private $fatherHuman;
private $errorMessage ="";
function __construct($father){
$errorMessage = $this->fatherHuman($father);
}
function fatherHuman($father){
if($father qualified to be father){
$fatherHuman = $father;
return "Object Created";//You can have more detailed string info on the created object like "This guy is son of $fatherHuman->name"
} else {
return "DNA failed to match :P";
}
}
}
function run(){
if(ctype_alpha($Rahul = Human(KingKong)){
echo $Rahul;
}
}
run(); // displays DNA failed to match :P
答案 7 :(得分:0)
您不必专门调用toString方法。什么时候打印对象toString被隐式调用。必须明确调用任何其他方法。
答案 8 :(得分:-1)
使用__toString()
会覆盖打印该类对象时调用的运算符,因此可以更轻松地配置应该如何显示该类的对象。
答案 9 :(得分:-4)
就像用c#覆盖:
class Person
{
public Person(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}
public string FirstName { get; set; }
public string LastName { get; set; }
public override string ToString()
{
return FirstName + “ “ + LastName;
}
}