【发布时间】:2018-06-05 13:53:37
【问题描述】:
我想测试使用带有 $this 参数的 toString() 方法,只在我的所有对象中调用一次。 为此我有:
class A {
public function toString($object) {
$result = '<pre>';
foreach ($object as $key => $value) {
$result .= $key . ': ' . $value . '<br>';
}
$result .= '</pre>';
return $result;
}
}
class B extends A {
public function toString() {
parent::toString($this);
}
}
但这给我一个:
严格标准:B::toString() 的声明应与 A::toString($object) 兼容
但是当我在 B 中使用带有 $this 参数的函数时,不允许使用 $this,而对于其他,则缺少该参数。
【问题讨论】:
-
在 A 类中将对象传递给
toString()的想法听起来是错误的。您应该在对象本身上有一个toString()方法,而不是按照您尝试的方式(即传递对象本身)。 -
如果您觉得有必要走这条路,您最好的选择可能是将
A::toString($object)更改为称为_toString($object)之类的受保护方法,然后使用B::toString() { parent::_toString($this); } -
总而言之 - 有许多内置方法可以完成类似于
toString中的循环的事情(它只会不处理深层对象)。考虑查看其中的一些,您可能会发现一些有用的东西:json_encode、var_export、serialize 浮现在脑海中——我相信还有其他的。 -
...更不用说已经有一个
__toString()魔术方法专门用于这种事情,它可以让你echo $object -
回显 $object 显示错误“可捕获的致命错误:类的对象无法转换为字符串”