Hi Nikita

I was indeed thinking about the former: acceptsValue; but I would excpect that 
if the concrete value is a subtype of the current type, the fuction would also 
return true. What I'm basically interested in: will this method throw a type 
error when I pass this value? In other words: "will this method accept this 
value?"

Is that in line with your view on `acceptsValue`? 

Kind regards
Brent

> On 29 Jan 2021, at 10:33, Nikita Popov <nikita....@gmail.com> wrote:
> 
> On Fri, Jan 29, 2021 at 9:15 AM Brent Roose <bre...@stitcher.io 
> <mailto: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