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

> 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
>

I just took a quick look at this, and apart from the strict_types
distinction, another annoying edge case here is that our type checks aren't
side-effect free. As of PHP 8.1, we have at least the deprecation warning
for precision loss in weak float -> int casts, and more generally,
arbitrary side-effects during __toString() calls on objects. So just
performing a normal type check may not be suitable for this use case.

Regards,
Nikita

> 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> 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