Hello list, to revive this old RFC. One really nice application of never parameters is with intersection types:
interface I {} interface ReturnI { public function foo(never $x): I; } interface AcceptI { public function foo(I $x): mixed; } function f(ReturnI&AcceptI $arg, I $x): I { return $arg->foo($x); } Look at a live example where I simulate the "never" with an "AlmostNever" interface. https://3v4l.org/dPbgt It can even be applied with additional parameters: https://3v4l.org/l8eG6 An application can use this to reduce the range of individual interfaces, and cover scenarios that would otherwise require generics or callable types. So.. I would really like to see it :) --- Andreas On Sat, 14 Aug 2021 at 01:27, Jordan LeDoux <jordan.led...@gmail.com> wrote: > > Hey internals, > > I've been working on the draft for my operator overloading RFC, and in > doing so I encountered a separate change that I would like to see. > > That is, the use of `never` as an argument type for interfaces. Since > arguments in PHP are contravariant to preserve Liskov substitution, `never` > as the bottom type should indicate that implementing classes can require > any type combination they want. This is in fact consistent with type theory > and set theory, and is how the bottom type is treated in several other > languages. > > In this case, the bottom type would be used to indicate covariant parameter > polymorphism while not conflicting with LSP. > > This would provide a sort of minimal form of generics to PHP without the > issues that actual generics present from an implementation perspective. It > would not, however, restrict or hinder any future RFC for generics. > > This is at the first draft stage, and I currently have the RFC on a github > repo to allow for easy contribution and collaboration. > > Any feedback is greatly appreciated. > > https://github.com/JordanRL/never-argument-type > > Jordan