【发布时间】:2017-07-05 19:56:56
【问题描述】:
tl;dr 当迭代包含 DateTime 属性的 1000 个对象的数组并转储此属性时,我得到 1000 个有效的 DateTime 对象作为响应。在后续转储行上添加->format 时,终止立即在第一个元素处停止。在转储语句之外添加format() 调用只会在第 1000 个元素处停止终止。
我目前在我的 php (symfony) 项目中遇到以下错误:
在布尔值上调用成员函数 format()
通常这很容易解决,但我在调试时遇到了一些奇怪的行为。
private function filterDuplicates(array $data) {
$duplicateMap = [];
foreach($data as $index => $item) {
// dump here, see below
$hashKey = md5($item->getBracelet()->getId() . $item->getTimestamp()->format('d/m/y H:i'));
if (isset($duplicateMap[$hashKey])) {
unset($data[$index]);
unset($data[$duplicateMap[$hashKey]]);
} else {
$duplicateMap[$hashKey] = $index;
}
}
return $data;
}
此代码当前在我尝试设置 $hashkey 变量的位置给出了格式错误。显然,其中一个 $item 对象包含无效的 DateTime,或者我是这么认为的。
添加 dump($item->getTimeStamp()); 时,我得到了 1000 个正确的 DateTime 对象,然后是相同的 format() 错误。最初,我认为这意味着错误发生在数组中的最新对象上。
但是,我的数组仅包含 1000 个对象,我使用 dump(count($data)); 进行了测试。
奇怪。不过没关系。我重写了我的转储:dump($item->getTimestamp() instanceof \DateTime)。这打印了 1000 次 true。一切似乎都应该正常工作。
现在是奇怪的部分。
我现在将我的转储更改为:
dump($index);
$hashKey = md5($item->getBracelet()->getId() . $item->getTimestamp()->format('d/m/y H:i'));
并收到此输出:
...
996
997
998
999
PHP Fatal error: Call to a member function format() on boolean in /Users/svenhoskens/Documents/web_projects/Tomorrowland_api/vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/DateTimeType.php on line 53
但是,将其更改为:
dump($index);
dump($item->getTimestamp()->format('d/m/y H:i'));
$hashKey = md5($item->getBracelet()->getId() . $item->getTimestamp()->format('d/m/y H:i'));
我得到了这个奇怪的输出:
0
PHP Fatal error: Call to a member function format() on boolean in /Users/svenhoskens/Documents/web_projects/Tomorrowland_api/src/AdminPanelBundle/Command/ProcessDatafileCommand.php on line 374
如您所见,php 现在不是循环遍历 1000 个对象并在最后抛出错误,而是在一开始就抛出错误,即使我的转储后面紧跟着导致错误的完全相同的格式调用!
我在这里缺少什么?什么可能导致这种行为?
【问题讨论】:
-
$item->getTimestamp() 是做什么的?问题可能就在那里,因为在某些情况下它似乎返回了一个布尔值。
-
这是我的实体中的一个简单 getter,它返回 DateTime。当我转储返回值的类型时,它会在 1000 个案例中的每一个中返回一个 DateTime。不过,正如我的问题底部所述,只要我在它下面的行上添加 ->format 调用,这个循环似乎就会停止。
-
如果您尝试省略
getTimestamp()调用并使用硬编码的日期时间列表尝试此操作怎么办?