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

Sta*_*ann 26 php oop tostring

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

<?php
    class cat {
        public function __toString() {
            return "This is a cat\n";
        }
    }

    $toby = new cat;
    print $toby;
?>
Run Code Online (Sandbox Code Playgroud)

这不是这个:

<?php
    class cat {
        public function random_method() {
            echo "This is a cat\n";
        }
    }

    $toby = new cat;
    $toby->random_method();
?>
Run Code Online (Sandbox Code Playgroud)

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

Lig*_*ica 19

你不需要它.但是定义它允许将对象隐式转换为字符串,这很方便.

具有echo直接被认为是不良形式的成员函数,因为它对类本身的输出提供了过多的控制.您希望从成员函数返回字符串,并让调用者决定如何处理它们:是将它们存储在变量中,还是将echo它们存储出来,或者其他什么.使用magic函数意味着您不需要显式函数调用来执行此操作.


nic*_*ass 14

除了所有现有的答案,这里有一个例子,:

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();
Run Code Online (Sandbox Code Playgroud)

这是一个简单的类,可以帮助您管理javascripts.您可以通过调用注册新脚本$scripts->add('...').

然后处理队列并打印所有已注册的脚本只需调用print $scripts;.

显然,这个类在这种形式下是没有意义的,但如果你实现资产依赖,版本控制,检查重复包含等,它开始有意义(例子).

基本思想是这个对象的主要目的是创建一个字符串(HTML),所以在这种情况下使用__toString很方便...


Mic*_*ski 8

__toString()当对象被传递给函数(especho()print())且其上下文预期为字符串时调用。由于对象不是字符串,因此它__toString() 处理将对象转换为某种字符串表示形式。


fal*_*tro 5

它只是一种生成对象字符串表示的标准化方法.你random_method如果你认为在你的程序中的所有对象使用相同的方法,如果您使用第三方库,这可能并非如此方法效果.

你不需要魔法,但它提供了方便,因为你永远不必真正地调用它.

此外,如果PHP应该在内部想要将您的对象转换为文本,它就知道如何做到这一点.