Does Your Test Suite Actually Test Anything?
You have 100% code coverage. Every line is executed. The CI badge is green. Then you refactor a condition from > to >=, and not a single test fails. Your tests ran the code, but they didn't verify it.
You have 100% code coverage. Every line is executed. The CI badge is green. Then you refactor a condition from > to >=, and not a single test fails. Your tests ran the code, but they didn't verify it.
Most PHP developers start with MVC. You know where things go: controllers handle requests, models handle data, views handle output. Then the project grows, and the model becomes 800 lines of ORM queries, validation rules, and business logic fighting for space.
Most PHP frameworks are installed as Composer packages. They end up in vendor/, behind a version constraint, and you interact with them through their public API. You don't read the implementation. You don't modify it. When something breaks after an update, you adapt your code to match the new version.
PHP does not have generics. A method that returns array gives no compile-time guarantee about what the array contains. PHPDoc annotations like @return array<Book> help static analysers, but they are invisible at runtime. A wrong element slips in, and the error surfaces far from the insertion point.
In most PHP projects, cache logic ends up scattered across business code. The handler that executes the query also contains the caching logic: key generation, lookup, storage, TTL. Two responsibilities, cache code and business code, coexist in the same method.