(PHP)为什么我的DateTime对象属性强制转换为字符串,但仅当从其他类访问时才强制转换为字符串?
这对我来说毫无意义,也许对这里的其他人来说也有意义 我有一个名为(PHP)为什么我的DateTime对象属性强制转换为字符串,但仅当从其他类访问时才强制转换为字符串?,php,datetime,casting,Php,Datetime,Casting,这对我来说毫无意义,也许对这里的其他人来说也有意义 我有一个名为Event的类,它表示一个事件。它有三个属性:一个id、一个description、一个time。time属性本身是DateTime类型的对象 第三个类是成员,它有一个名为事件的属性,该属性由事件对象数组填充。因此,成员对象的一个简单的var\u dump如下所示,省略了一些与此无关的属性: object(Member)#5 (32) { ["id":protected]=> string(3) "127" ["e
Event
的类,它表示一个事件。它有三个属性:一个id
、一个description
、一个time
。time
属性本身是DateTime
类型的对象
第三个类是成员
,它有一个名为事件
的属性,该属性由事件
对象数组填充。因此,成员
对象的一个简单的var\u 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"
}
}
}
}
在成员
类中,有一个以表格形式列出所有事件的函数,formatEventsTable()
,简而言之,它是这样做的:
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
类中的foreach
循环中,添加一个调用$this->time->format('j/ny')
的函数Event::formataTableRow()
,然后在成员::formatEventsTable()中的foreach
循环中简单地调用该函数
…然后它就可以正常工作了
那么,为什么我可以从属于属性的类中访问DateTime对象,而不是从另一个类中的函数中访问?为什么强制转换(?)到一个字符串呢?我想,这里的问题是您试图从其访问范围之外访问受保护的类成员
不过,我不知道为什么会出现这个特殊错误,而您应该会遇到
无法访问Event::time的受保护属性类错误。更重要的是,我编写了一些类似于您的代码,并且得到了正确的错误(PHP5.4.45)。我想知道您使用的PHP版本。答案是我是个白痴
成员
和事件
类都扩展了一个基类,我显然在该类中定义了一个神奇的\uuuu-toString()
方法,在该方法中,我专门检查日期时间
对象,并按照我在这里看到的方式将它们输出为'Y-m-d'
字符串
我仍然不明白为什么var\u dump
ing对象会调用它的\u toString()
方法。哦,当然!真是个蠢货。我在7.0.0(我想);我想这可能是PHP7中引入的一个bug(如果是这样的话)。如果它告诉我我试图访问一个受保护的成员,我就不会这么困惑了。我想可能是DateTime
在PHP7.Huh中实现了一个\uu get()
魔法函数。在7.0.0的不同分支上尝试过,仍然无法再现相同的效果。我最好的猜测是,它的代码比您共享的代码要多一些,并且它会以某种方式影响最终的错误。不过,改变这个变量的可见性有帮助吗?现在是凌晨一点半,所以我刚关掉电脑。将在明天进行测试,以确定可见性是否已更改。不过,刚刚意识到:var\u dump
确实访问受保护的属性,因此它不仅是可视的,因为var\u dump
ingDateTime
对象本身也将其显示为字符串var_dump($event)
=$event->time
是一个DateTime对象,受保护的成员是可转储的<代码>变量转储($event->time)
=$event->time
是一个字符串。它可能与php7中引入的新错误处理技术有关。您是否偶然发现了代码中的异常?问题是,由于7.0.0这样的致命错误不是通过标准机制报告的,而是作为错误对象抛出的,据文档所述,它声明了_toString()方法,如果异常处理不正确,可能会产生与您相同的效果。我仍然相信恶魔潜伏在你认为与问题无关的代码中,将可见性更改为public
修复了它,然后将var_dump
s更改为DateTime
对象。
string(10) "2010-01-01"