我所做的大部分工作都是在程序上编写的遗留应用程序上。我开始将它的部分转换为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()
?
答案 0 :(得分:4)
直接来自documentationPHP.net:
__toString()
方法允许班级决定如何做出反应 当它被视为一个字符串。例如,echo $obj;
将会是什么 打印。此方法必须返回一个字符串,否则是致命的 发出E_RECOVERABLE_ERROR
级别错误。
该类本身不使用__toString()
,它仅在评论中的使用建议中隐式提及:echo $d1; // should print 5:55
每当您将对象视为字符串时,PHP会将$obj
替换为$obj.__toString()
。
这种情况发生在:
echo
- 荷兰国际集团printf
与%s
.
这当然不是一份详尽的清单。如果您将对象视为 不 具有__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