Pull to refresh

Comments 13

Я аж календарь проверил... Не, ну мало ли? Вдруг мои молитвы исполнились и мы снова в 2007? Текстовые RPG, CodeIgniter, MySQL...

А баги-то какие! (bool)$value, и заморочики с мультибайтом. Там же еще и данные, наверняка, с фронта как form-data приходят, а не по вебскоетам json летает. Автор, а ты с тем, что поля чек-бокса просто нет, когда он снят не мучался?

Блин, надо бы старым друзьям позвонить, что ли...

Ха, календарь можешь не перепроверять - стек и правда чисто ностальгический, и это где-то выбор того, что умею и наивного предположеня, что проект простой да и он пет-проект, где хочется не воевать с тулингом, а писать игру. CodeIgniter + MySQL + текстовая RPG - олдскул как он есть ))

Про чекбокс ты прямо в корень смотришь: да, ровно эта классика. Снятый чекбокс в форме просто не приходит в запросе, и половина «загадочных» багов растёт из того же огорода, что и (bool)“false”. Лечится скучно - нормализовать вход на бэке и не верить тому, что прислал браузер.

"false" ==> true

Javascript'еры сейчас посмеиваются над такой тривиальной для них задачей )

Так и есть, спорить не буду )) Правда у JS свои скелеты в том же шкафу - “0” == false, [] == ![], NaN !==NaN. Слабая типизация, она для всех одинаково ласковая, просто грабли разной формы. Так что смеёмся вместе, по-доброму )

boolvar ? 1 : 0

Я проверил, можно сделать без тернарника

$update['value_bool'] = boolvar * 1

Ни одна из этих граблей не лечится чтением документации вперёд

Почему же?

https://www.php.net/language.types.boolean.php#:~:text=Example %231 Casting to Boolean

Эх ссылку разломало. Нажимать нужно на правый обломок.

Спасибо, но тут небольшое смещение акцента. * 1 работает, когда на входе уже настоящий bool — тогда да, true * 1 | false * 11|0, короче тернарника.

Но грабля была не в этом. Из формы прилетала строка "false", а не булево:

  • (bool) "false" === true — непустая строка истинна, поэтому тернарник и давал 1;

  • "false" * 1 тут не спасает: на PHP 8 это TypeError: Unsupported operand types: string * int, на PHP 7 — 0 с warning. То есть либо падение, либо «угадал» по случайной причине.

Поэтому фикс — filter_var($v, FILTER_VALIDATE_BOOLEAN): он понимает именно строковые "false"/"0"/""false.

Про «не лечится чтением доков» — справедливо придрались: правила приведения, конечно, задокументированы. Я имел в виду не «доки врут», а что заранее не угадаешь, в каком из тысяч мест прилетит именно строка "false" из живого ввода. Вылезает на реальных данных, а не на странице про casting.

Чувак, неужели это такой сложный комментарий был, что отвечать на него пришлось просить ChatGPT?

Почему все вокруг думают только про GPT? Есть в разы круче AI чем GPT да и манера писать долгие комментарии или просто отвечать на комментарии, как вообще соотносится с AI?

Скоро из-за каждого угла и столба будет мерещиться GPT и AI)) Хотя я понимаю, думаю что понимаю.

Про bool я понимаю. Предложил только заменить ? 1 : 0 на * 1

Одна беда: переписать тысячи $char[‘…’] на $char->… за раз — это поставить мир на паузу.

Эм, что? Почему что-то надо ставить на какую-то паузу?

«Пауза мира» — метафора, не буквальная остановка сервера. Смысл: заменить тысячи $char['x'] на $char->x можно только одним огромным коммитом, который трогает разом весь код. Выкатываешь — и если хоть в одном из тысяч мест опечатка, падает у живых игроков прямо в бою или походе.

То есть выбор: либо заморозить всю остальную разработку ради одного big-bang рефактора и надеяться, что нигде не промахнулся, либо ломать прод вживую. «Нельзя ставить на паузу» = нельзя позволить себе такой разовый риск, пока по карте ходят живые люди.

Поэтому и сделал ArrayAccess на Entity: старый $char['x'] и новый $char->x работают одновременно → миграция по кусочку, без остановки.

Сразу видно гениального маркетолога. Собственная криворукость легким движением руки превращается в "грабли РНР", которые ещё и "не лечатся чтением документации".

Гениального человека, гениальность виджно во всем )

Sign up to leave a comment.

Articles