【问题标题】:Strange behaviour while debugging Call to a member function format() on boolean调试布尔时调用成员函数 format() 时的奇怪行为
【发布时间】: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() 调用并使用硬编码的日期时间列表尝试此操作怎么办?

标签: php symfony


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    相关资源
    最近更新 更多