Two packages that work individually and break together, expressed as a version bound that was wrong for anybody not using both. Narrowing the requirement would have said “this…
A trait providing a logger to eleven classes, each of which called a static accessor to get one. The trait was hiding a service locator behind a method…
Four array functions that every project had written as helpers, finally in the language. array_any short-circuits, which is the difference from array_filter followed by a count and matters…
Deprecating a method had been a docblock tag that only an IDE respected, and 8.4 makes it something the engine reports. It works on functions, methods, constants and…
A property that everything reads and only the class writes had needed a private property, a public getter and no setter — three declarations for one idea. This…
A static helper called from forty places, and a test that needed it to return something different. Keeping the static as a delegating shim is what makes a…
A second year of the same decision, revisited on schedule rather than by drift. The number going down on its own is the argument for logging deprecations rather…