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
HOWEVER ,在改变之后:
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
正如你所看到的,不是循环遍历1000个对象并在最后抛出错误,php现在会在一开始就抛出错误,即使我的转储后面紧跟着同样的格式调用,这会导致错误!
我在这里缺少什么?什么可能导致这种行为?
答案 0 :(得分:0)
这个问题目前已经解决,但恐怕我不知道为什么。完全重启我的机器后,无法再次重现该问题。无论转储命令的内容或顺序如何,循环现在都在正确的时间失败。如果有人再遇到这样的事情,请告诉我。