DateTime :: setTime () ожидает, что параметр 1 будет целым, заданной строкой, но исчезнет при попытке наблюдения - PullRequest
0 голосов
/ 21 июня 2020

У меня есть следующий фрагмент кода в php7 .4, чтобы создать дату из другого

    $date = clone $regularCourse->getNextCronExecutionDate();
    $date->modify('+ 3 days');
    $date->setTime($date->format('H'), $date->format('i'), 0, 0);

. Я тестировал его локально и в производственной среде, и раньше он работал нормально. И вдруг начало давать сбой. с ошибкой

DateTime::setTime() expects parameter 1 to be int, string given

, и он терпел неудачу довольно регулярно и предсказуемо, потому что мой часовой дал мне 4000 случаев возникновения события (это задача cron, которая запускается каждую минуту, и часовой показывает мне, что ошибка возникала 60 раз каждый часов за последние дни)

НО!

Теперь, когда я добавил отладку, чтобы отобразить значение, она больше не дает сбоев Код, который я использовал

     // Added to debug some courses failing
     ob_start();
     var_dump($date);
     $dumped_message= ob_get_clean();

     \Sentry\addBreadcrumb(
         new \Sentry\Breadcrumb(
             \Sentry\Breadcrumb::LEVEL_INFO,
             \Sentry\Breadcrumb::TYPE_DEFAULT,
             'error_reporting',
             "course Id " . $regularCourse->getId()
         )
     );
     \Sentry\addBreadcrumb(
         new \Sentry\Breadcrumb(
             \Sentry\Breadcrumb::LEVEL_INFO,
             \Sentry\Breadcrumb::TYPE_DEFAULT,
             'error_reporting',
             $dumped_message
         )
     );

Я не знаю, вызывает ли var_dump-ing переменную побочный эффект?

поэтому мои вопросы

  1. когда возникает эта ошибка?
  2. почему мой код отладки устраняет проблему?

1 Ответ

1 голос
/ 21 июня 2020

Если вы используете declare(strict_types=1), вам нужно быть осторожным с типами:

  • DateTime :: setTime () ожидает целые числа:

    public DateTime::setTime ( int $hour , int $minute [, int $second = 0 [, int $microseconds = 0 ]] ) : DateTime
    
  • DateTime :: format () возвращает строки:

    public DateTime::format ( string $format ) : string
    

В этом случае вы можете просто привести к int, хотя которые могут легко маскировать другие ошибки формата:

declare(strict_types=1);
$date = new \DateTime();
// Correct
$date->setTime((int)$date->format('H'), (int)$date->format('i'), 0, 0);
// Typo, no error thrown becuase `Sunday` casts to 0
$date->setTime((int)$date->format('l'), (int)$date->format('i'), 0, 0);

... в то время как

$date = new \DateTime();
$date->setTime($date->format('l'), $date->format('i'), 0, 0);
// DateTime::setTime() expects parameter 1 to be int, string given
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...