-2

我所做的大部分工作都是在程序上编写的遗留应用程序上。我开始将它的一部分转换为 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()

4

3 回答 3

4

直接来自文档PHP.net

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

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

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

这发生在:

  • echo-ing
  • printf与_%s
  • 转换为字符串:(字符串)$obj
  • .

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

Catchable fatal error:  Object of class * could not be converted to string in
于 2013-05-06T20:36:13.793 回答
1

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

这将返回一个 Duration 类的对象,由字符串 $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() 方法,该代码中的第三行将不起作用。

于 2013-05-06T20:48:33.363 回答
0

这是一种神奇的方法,您可以在文档中阅读。示例 #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
于 2013-05-06T20:32:09.430 回答