Если условие проходит, но оно не должно проходить

#php #laravel

Вопрос:

Поэтому я проверяю пару условий в заявлении if:

 if ($amount !== $payment->price || strtolower($currency) !== strtolower($payment['currency'])) {
    Log::info($amount);
    Log::info($payment->price);
    Log::info(strtolower($currency));
    Log::info(strtolower($payment['currency']));
    $payment->status = Payment::STATUS_NEEDS_ATTENTION;
    $payment->message = Payment::PAYMENT_ERROR;
} else {
    $payment->message = Payment::PAYMENT_ERROR;
    $payment->status = Payment::STATUS_PAID;
}
 

И я не понимаю , почему он проходит if условие, и это то, к чему я прихожу Log::info , поскольку я вижу, что он не должен проходить if условие, к которому он должен перейти else

 [2021-09-30 17:23:31] local.INFO: 1397  
[2021-09-30 17:23:31] local.INFO: 1397  
[2021-09-30 17:23:31] local.INFO: eur  
[2021-09-30 17:23:31] local.INFO: eur  
 

Я не понимаю, почему это соответствует условию «если», но не иначе?

Комментарии:

1. Как мы можем знать, если вы не сообщили нам значения переменных? Пожалуйста, покажите нам вывод var_dump([$amount, $payment->price, $currency, $payment['currency']]); Также, вы извлекаете цену из платежа, как если бы это был объект $payment->price , но затем в той же строке извлекаете валюту , как если бы платеж был массивом $payment['currency'] . Это немного странно, не так ли?

2. Вы можете попробовать использовать оператор != вместо !==

3. Мои извинения, я не видел, чтобы код регистрировал значения, и вы выводили их в своем вопросе. Однако при использовании var_dump должен отображаться тип данных, который может помочь вам понять, почему !== это не то же самое, что != . Кроме того, вам все еще нужно решить проблему «объект против массива».

Ответ №1:

Возможное объяснение может заключаться в !== операторе, который вы использовали. Их тип данных может отличаться. Что вы можете попробовать, так это зарегистрировать их PHP gettype() или var_dump() проверить их тип данных.

Почему это должно быть причиной? Различные пакеты , используемые для оплаты, и тележки могут возвращаться price string , например, в другом формате кодирования.

Кроме того, имейте в виду, что сравнение 2 float значений может не дать ожидаемого результата. Убедитесь, что они округлены до приемлемой точки, где может быть допущена неточность