Re: [PHP-DEV] [DISCUSSION] ReflectionType::accepts

2021-09-01 Thread Nikita Popov
On Fri, Jan 29, 2021 at 11:16 AM Brent Roose  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  wrote:
>
> On Fri, Jan 29, 2021 at 9:15 AM Brent Roose  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
>
>
>


Re: [PHP-DEV] Re: [RFC] Increment/Decrement Fixes

2021-09-01 Thread Nikita Popov
On Sun, Mar 8, 2020 at 8:31 PM Rowan Tommins 
wrote:

> On 01/03/2020 21:23, Rowan Tommins wrote:
> > https://wiki.php.net/rfc/increment_decrement_fixes
>
>
> Hi all,
>
> I have just posted a substantially rewritten version of the above RFC.
>
> * The proposal to change boolean behaviour has been dropped.
> * More justification has been included for treating nulls differently.
> * The suggestion of raising errors just for the currently broken
> operators has been explicitly addressed.
>
> I would urge anyone who reacted instinctively to the original proposal
> to read this version, and engage with the reasoning it presents, even if
> they disagree with my conclusions.
>

For the record, increment/decrement on arrays, resources and objects now
throws due to https://wiki.php.net/rfc/arithmetic_operator_type_checks.

Personally I think it's fine to change the behavior of "$null--", to make
it consistent with "$null - 1" and "$null++".

Making "$null--" into a TypeError should imho only be done if we also make
other arithmetic on null a TypeError (e.g. $null + 1, $null * 2, etc.)

Regards,
Nikita