strpos returns the position of the needle, and position zero is falsy — so the obvious check silently fails for exactly the case where the needle is at…
5.8 brought Carbon 2, and the change that matters is not the API surface — it is that CarbonImmutable exists and the mutable class is still the default…
Flattening an array was [].concat(…arrays), which works for one level and reads like a trick rather than an operation. The default depth of one catches people who expect…
Getting every match with capture groups meant a while loop over regex.exec, mutating lastIndex, with an infinite loop waiting for anyone who forgets the g flag. Throwing on…
The cheapest API version is the one never created, and that stays achievable for far longer than most teams expect provided every change is additive. The two list…
json_decode returns null on failure, and null is also a perfectly valid decoded value — so the only correct check was a separate function call that nobody remembered…
A flag decouples deploying from releasing, which is genuinely valuable, and it doubles the number of code paths — permanently, unless somebody deletes it. Two flags interacting is…
Two deployables writing the same tables is one service with extra steps. Deciding who owns them is the whole decision, and the intermediate state lasts.