我理解它是如何工作的,但为什么我们会实际使用它呢?
<?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很方便...
__toString()
当对象被传递给函数(especho()
或print()
)且其上下文预期为字符串时调用。由于对象不是字符串,因此它__toString()
处理将对象转换为某种字符串表示形式。
它只是一种生成对象字符串表示的标准化方法.你random_method
如果你认为在你的程序中的所有对象使用相同的方法,如果您使用第三方库,这可能并非如此方法效果.
你不需要魔法,但它提供了方便,因为你永远不必真正地调用它.
此外,如果PHP应该在内部想要将您的对象转换为文本,它就知道如何做到这一点.