我们在PHP中使用__toString()的位置和原因是什么?

时间:2011-03-02 19:19:17

标签: php oop tostring

我理解它是如何工作的,但为什么我们会实际使用它?

<?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();
?>

我们不能只使用任何其他公共方法输出任何文字吗? 为什么我们需要像这样的魔法?

10 个答案:

答案 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)

当一个对象传递给一个函数(esp __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;

}

}