__toString - 它在这个类中做了什么?

时间:2013-05-06 20:28:21

标签: php class

我所做的大部分工作都是在程序上编写的遗留应用程序上。我开始将它的部分转换为OOP,并且遇到了这个用于一起添加多次的示例类:

在课程的底部,有一个名为__toString()的公共函数,它似乎返回一些格式化的文本。

class Duration 
{
    /*
        $d1 = Duration::fromString('2:22');
        $d1->add(Duration::fromString('3:33'));
        echo $d1; // should print 5:55
    */
    public static function fromString($string)
    {
        $parts = explode(':', $string);
        $object = new self();
        if (count($parts) === 2) {
            $object->minutes = $parts[0];
            $object->seconds = $parts[1];
        } elseif (count($parts) === 3) {
            $object->hours = $parts[0];
            $object->minutes = $parts[1];
            $object->seconds = $parts[2];
        } else {
            // handle error
        }
        return $object;
    }

    private $hours;
    private $minutes;
    private $seconds;

    public function getHours() {
        return $this->hours;
    }

    public function getMinutes() {
        return $this->minutes;
    }

    public function getSeconds() {
        return $this->seconds;
    }

    public function add(Duration $d) {
        $this->hours += $d->hours;
        $this->minutes += $d->minutes;
        $this->seconds += $d->seconds;
        while ($this->seconds >= 60) {
            $this->seconds -= 60;
            $this->minutes++;
        }
        while ($this->minutes >= 60) {
            $this->minutes -= 60;
            $this->hours++;
        }
    }

    public function __toString() {
        return implode(':', array($this->hours, $this->minutes, $this->seconds));
    }

}

公共静态函数fromString()包含一个返回,并且是从脚本调用类的方式。这个班级如何使用__toString?为什么不将内爆简单地包含在fromString()

3 个答案:

答案 0 :(得分:4)

直接来自documentationPHP.net

  

__toString() 方法允许班级决定如何做出反应   当它被视为一个字符串。例如, echo $obj; 将会是什么   打印。此方法必须返回一个字符串,否则是致命的   发出 E_RECOVERABLE_ERROR 级别错误。

该类本身不使用__toString(),它仅在评论中的使用建议中隐式提及:echo $d1; // should print 5:55

每当您将对象视为字符串时,PHP会将$obj替换为$obj.__toString()

这种情况发生在:

  • echo - 荷兰国际集团
  • printf%s
  • 一起使用
  • cast to string:(string)$ obj
  • .
  • 连接

这当然不是一份详尽的清单。如果您将对象视为 具有__toString方法的字符串,则会得到:

Catchable fatal error:  Object of class * could not be converted to string in

答案 1 :(得分:1)

基本上,一个从字符串创建Duration对象,另一个将Duration对象转换为字符串。

这将返回一个Class类的对象,由字符串$ string:

组成
public static function fromString($string)  { ... store input string ... }

如果您现在想要输出原始字符串,则不能只回显Duration对象本身,因为它不是字符串而是Duration对象。

如果您希望能够回显Duration对象,则可以实现__toString()函数:

public function __toString() { ... build and return output string ... }

然后你可以做这样的事情:

$stringOne = 'Some string';
$durationObject = Duration::fromString($stringOne);
echo $durationObject; // Echo-ing the object works because __toString is implemented.

如果你没有实现__toString()方法,该代码中的第三行将无法工作。

答案 2 :(得分:0)

这是一种神奇的方法,你可以在documentation中阅读。示例#2:

<?php
// Declare a simple class
class TestClass
{
    public $foo;

    public function __construct($foo)
    {
        $this->foo = $foo;
    }

    public function __toString()
    {
        return $this->foo;
    }
}

$class = new TestClass('Hello');
echo $class; // Hello