这对我来说没有任何意义——也许对这里的其他人来说有意义。
我有一个名为Event
的类,它表示一个事件。它有三个属性:id
、description
和time
。time
属性本身就是DateTime
类型的对象。
第三个类Member
具有一个名为Events
的属性,该属性由Event
对象的数组填充。因此,Member
对象的一个简单的var_dump
看起来是这样的,省略了一些与此无关的属性:
object(Member)#5 (32) {
["id":protected]=>
string(3) "127"
["events":protected]=>
array(1) {
[0]=>
object(Event)#13 (4) {
["id":protected]=>
string(1) "1"
["description":protected]=>
string(10) "Some text here"
["time":protected]=>
object(DateTime)#14 (3) {
["date"]=>
string(26) "2010-01-01 00:00:00.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
string(17) "Europe/London"
}
}
}
}
在Member
类中,有一个函数以表格形式列出所有事件,formatEventsAsTable()
,简而言之就是这样做的:
public function formatEvents() {
$return = <<<EOT
<table>
<tbody>
EOT;
foreach ($this->events as $event) {
$date = $event->time->format('j/n Y');
$return .= <<<EOT
<tr>
<td>$date</td>
<td>$event->text</td>
</tr>
EOT;
}
$return .= <<<EOT
</tbody>
</table>
EOT;
return $return;
}
据我所知,这应该起作用:在循环中,$event
是一个Event
对象(可通过循环期间的var_dump
验证),其属性time
是DateTime
对象,因此应该具有format
函数但它不起作用
出于某种原因,DateTime
对象被强制转换为字符串,我得到了以下错误消息:
致命错误:未捕获错误:在/path/to/file/class.member.php:116 中的字符串上调用成员函数format()
这是我最意想不到的:var_dump $event
将属性time
显示为DateTime对象。但var_dump $event->time
产生
string(10) "2010-01-01"
更奇怪的是:如果我把实际代码放在Event
类内的foreach
循环中,添加一个调用$this->time->format('j/n Y')
的函数Event::formatAsTableRow()
,然后简单地在Member::formatEventsAsTable()
中的foreach
循环中调用该函数…,那么它就可以正常工作。
那么,为什么我可以从作为属性的类中访问DateTime对象,而不能从其他类中的函数中访问呢?为什么它在那里被强制施法(?)到字符串
我想,这里的问题是您试图从受保护的类成员的访问范围之外访问它。
不过,我不知道为什么你会得到这个特定的错误,而你应该得到Cannot access protected property of Event::time
类型的错误。更重要的是,我编写了一些与您类似的代码,并得到了正确的错误(php5.4.45)。我想知道您使用的php版本。
答案是我是个白痴。
Member
和Event
类都扩展了一个基类,我显然在该类中定义了一个神奇的__toString()
方法,在该方法中,我专门检查DateTime
对象,并将它们输出为'Y-m-d'
字符串。
然而,我仍然困惑于为什么var_dump
调用对象会调用它的__toString()
方法。