// returns User or false, see wiki
public function findByEmail($email)
Every legacy codebase has this method. The comment is the type system. Half the callers check for false, some check for null because a sister method returns null, one caller checks nothing and works by luck.
PHP 7.1 came out last week. Nullable types, void, iterable, multi-catch. Small features, but together they continue the direction 7.0 started: less implicit agreement, more signature. The one I care about is ?Type:
public function findByEmail(string $email): ?User
Now “maybe there is no user” is a fact the engine enforces. ?User is honest in a way that magic false never was. void does the same for commands: it declares “do not use my return value” instead of returning whatever the last line happened to produce.
The practical question is how to add types to an existing project without a religious rewrite. My approach, from a project we are moving through 7.x now. All new code is fully typed, no exceptions. Old code gets types only when touched for other reasons, and from the leaves inward: value objects and small services first, core classes last, because a type on a core method ripples into every caller and you do not want that ripple inside an unrelated bugfix. Where old code returns false, changing to ?Type is a behavior change, so it gets its own commit and a look at every caller.
Each added type is a small piece of tribal knowledge turned into a check. The wiki page lies eventually. The signature cannot.
Type the boundaries first. The middles can wait. The wiki page can stay as it is. Nobody reads it anyway.