Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
(PHP)为什么我的DateTime对象属性强制转换为字符串,但仅当从其他类访问时才强制转换为字符串?_Php_Datetime_Casting - Fatal编程技术网

(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
ing
DateTime
对象本身也将其显示为字符串
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"