On Fri, Jan 29, 2021 at 9:15 AM Brent Roose <bre...@stitcher.io> wrote:

> Hi Internals
>
> Since the addition of union types, it has become a little more cumbersome
> to determine whether a given parameter type accepts specific input.
> Personally I've been reusing this code blob in several places because of it:
>
> ```
> /** @var \ReflectionNamedType[] $types */
> $types = match ($type::class) {
>     ReflectionUnionType::class => $type->getTypes(),
>     ReflectionNamedType::class => [$type],
> };
>
> foreach ($types as $type) {
>     if (! is_subclass_of($type->getName(), ShouldBeStored::class)) {
>         continue;
>     }
>
>     // …
> }
> ```
>
> I wonder whether we would discuss adding a method on ReflectionType that
> accepts any given input, and tells you whether that input is valid for that
> type or not. I was thinking about `ReflectionType::accepts(string|object
> $input): bool` but we could discuss another name. With it, the above
> example could be refactored like so:
>
> ```
> if (! $type->accepts(ShouldBeStored::class)) {
>     return;
> }
>
> // …
> ```
>
> I believe this method should accept both class names and objects to be
> consistent with the existing reflection API. It would also work with
> intersection types, if they are to be added some day.
>
> What do you think?
>
> Kind regards
> Brent
>

There's two possible notions of what "accepts" does:

* acceptsValue(), whether a given value satisfies the type. Probably needs
a flag to determine whether strict_types semantics should be used or not.

* isSubTypeOf(), whether a given type satisfies the type in a subtyping
relationship.

You seem to be mixing these two up into one concept, even though they are
quite different. Which is the one you actually need? (I am much more open
to providing the former than the latter.)

Nikita

Reply via email to