Re: RFC idea: using the void type to control maximum arity of user-defined functions
| From: | Larry Garfield | Date: | Thu, 04 Apr 2024 16:19:40 +0000 |
| Subject: | Re: RFC idea: using the void type to control maximum arity of user-defined functions | ||
| References: | 1 2 3 4 5 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-122940@lists.php.net to get a copy of this message | ||
On Thu, Apr 4, 2024, at 3:49 PM, Tim Düsterhus wrote:
> Hi
>
> On 4/4/24 17:40, Vinicius Dias wrote:
>>> I like this concept, but instead of introducing a new syntax, have you
>>> considered leveraging attributes in the same way that PHP 8.3
>>> introduced #[Override]?
>>>
>>> #[Nonvariadic]
>>> function foo () {}
>>> foo(42); // warning: foo() expects exactly 0 arguments, 1 given
>>>
>>> I think the intent would be clearer and it would avoid introducing a new syntax.
>>>
>>
>> I agree that using an attribute would be better for this case.
>
> I disagree with an attribute being the right choice here. In contrast to
> #[\Override], this proposal changes the behavior for the *caller* of the
> function and likely also requires adjustments in child classes when
> newly introduced in a parent class or interface.
>
> Thus it is part of the function's API and thus should be part of the
> regular signature and not the attribute-based metadata.
>
> Best regards
> Tim Düsterhus
I would think following the pattern of dynamic properties would make the most sense. Require an
opt-in via attribute, with deprecation period. And possibly just remove the functionality at some
point in the future.
The core issue here IMO isn't the behavior itself, but the inconsistency.. C-implemented
functions reject extra args. PHP-implemented functions ignore them (modulo variadics). This is...
a total mess that has bitten me more than I want to admit. Normalizing it one way or the other
would be a win.
--Larry Garfield