On Sat, Aug 14, 2021 at 6:25 AM Nikita Popov <nikita....@gmail.com> wrote:
> > function addMultiple(CollectionInterface $collection, mixed ...$inputs): > void { > foreach ($inputs as $input) $collection->add($input); > } > > A static analyzer should flag this CollectionInterface::add() call as > invalid, because mixed is passed to never. Effectively, this means that an > interface using never argument types cannot actually be used in anything > *but* inheritance -- so what is its purpose? > > When used as a sort of... pseudo-generics replacement, you'd need to use Docblocks to specify these, because **this feature is not generics** (which you correctly pointed out). I probably should have made that MORE clear so as to not confuse or trick anyone. If this RFC were passed, it could be sort of used like generics but it would be a bit hacky to use it that way as your example illustrates. In the absence of generics, this would probably be used as a stopgap in combination with docblocks. That's the point I was trying to make. :) The main value I see from an inheritance perspective is using never to disallow an omitted type. The inheriting class may specify *any* type, even mixed, but it must do so explicitly. Larry: > So... if I am following correctly, the idea is to allow `never` to be used in an interface/abstract method only, as a way to indicate "you must specify a type here of some kind; I don't care what, even mixed, but you have to put something". Am I following? This is essentially correct, yes, however it's important to note, and I don't want to mislead anyone here: it's not possible (to my knowledge) to *only* allow this type for parameters on interfaces and abstracts. Or at least, doing so is much, much more complicated. The patch I provided is about 5 lines different, however it allows never as a parameter type everywhere, including functions. This is, to my mind, acceptable because never will behave entirely consistently with a bottom type in all such scenarios. It will compile just fine, but if you call any function that has an argument type of never, you will get TypeError. No type which can be provided at runtime, even null, will satisfy the type never, so practically it makes a function uncallable when used as an argument type. It must be widened through inheritance to be used. Jordan