2017-07-04 10 views
3

tl; dr DateTimeプロパティを含む1000個のオブジェクトの配列を反復処理し、このプロパティをダンプすると、1000個の有効なDateTimeオブジェクトが返されます。後続のダンプ行に->formatを追加すると、終了は最初の要素で直ちに停止します。 format()コールをダンプ文の外に追加すると、1000番目の要素での終了のみが停止します。デバッグ中に異常な動作が発生しました。ブール値

私は現在、私のPHP(symfonyの)プロジェクトで、次のエラーを経験してい

:メンバ関数形式に

コール()ブール

に通常、これは簡単に修正だろうしかし、私はデバッグ中にいくつかの奇妙な動作に遭遇しました。

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オブジェクトの1つに無効なDateTimeが含まれていると思いました。

dump($item->getTimeStamp());を追加すると、正確に1000の正しいDateTimeオブジェクトが取得され、その後に同じformat()エラーが発生します。当初は、配列の最新のオブジェクトでエラーが発生したと考えました。

しかし、私の配列には正確に1000個のオブジェクトしか含まれていません。dump(count($data));を使ってテストしました。

奇数しかし、大丈夫。私はそのようなものとして私のダンプを書き換えた:dump($item->getTimestamp() instanceof \DateTime)。これは1000回trueを印刷しました。すべてが動作するはずです。

今、変な部分です。

dump($index); 
dump($item->getTimestamp()->format('d/m/y H:i')); 
$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); 
$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個のオブジェクトをループして最後にエラーを投げるのではなく、私のダンプの直後に非常に同じフォーマットコールが続いていても、エラーが発生します。

私はここで何が欠けていますか?このような行動を引き起こす原因は何ですか?

+0

$ item-> getTimestamp()は何をしますか?場合によってはブール値を返すように見えるので、問題が存在する可能性があります。 – colburton

+0

DateTimeを返す、私のEntityのシンプルなゲッターです。戻り値の型をダンプすると、1000件ごとにDateTimeが返されます。しかし、このループは、私の質問の一番下に記載されているように、その下の行に - >フォーマットコールを追加するとすぐに停止するようです。 –

+0

'getTimestamp()'呼び出しを省略し、ハードコードされた日付時刻のリストでこれを試してみたらどうでしょう? – vrwim

答えて

0

問題は現在解決されていますが、理由はわかりません。私のマシンを完全に再起動した後、問題を再現することはできませんでした。ダンプコマンドの内容や順序にかかわらず、ループは正しい時刻に失敗します。誰かがこのようなことに再び遭遇したら、私に知らせてください。

関連する問題