调试时的奇怪行为在布尔

时间:2017-07-04 15:57:57

标签: php symfony

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现在会在一开始就抛出错误,即使我的转储后面紧跟着同样的格式调用,这会导致错误!

我在这里缺少什么?什么可能导致这种行为?

1 个答案:

答案 0 :(得分:0)

这个问题目前已经解决,但恐怕我不知道为什么。完全重启我的机器后,无法再次重现该问题。无论转储命令的内容或顺序如何,循环现在都在正确的时间失败。如果有人再遇到这样的事情,请告诉我。