> Am 29.05.2020 um 21:02 schrieb Larry Garfield <la...@garfieldtech.com>:
> 
> On Fri, May 29, 2020, at 9:32 AM, Nikita Popov wrote:
>> On Tue, May 5, 2020 at 3:51 PM Nikita Popov <nikita....@gmail.com> wrote:
>> 
>>> Hi internals,
>>> 
>>> I've recently started a thread on resurrecting the named arguments
>>> proposal (https://externals.io/message/109549), as this has come up
>>> tangentially in some recent discussions around attributes and around object
>>> ergonomics.
>>> 
>>> I've now updated the old proposal on this topic, and moved it back under
>>> discussion: https://wiki.php.net/rfc/named_params
>>> 
>>> Relative to the last time I've proposed this around PHP 5.6 times, I think
>>> we're technically in a much better spot now when it comes to the support
>>> for internal functions, thanks to the stubs work.
>>> 
>>> I think the recent acceptance of the attributes proposal also makes this a
>>> good time to bring it up again, as phpdoc annotations have historically had
>>> support for named arguments, and this will make migration to the
>>> language-provided attributes smoother.
>>> 
>> 
>> Regarding the question of what to do with regard to LSP validation and
>> parameter names changing during inheritance: During internal discussion,
>> the following option has come up as a possible compromise:
>> 
>> 1. When calling a method, also allow using parameter names from the parent
>> class/interface.
>> 2. During inheritance, enforce that the same parameter name is not used at
>> different positions.
>> 
>> This ensures that renaming parameter names during inheritance does not
>> break code relying on parameter names of the parent method. At the same
>> time, it prohibits genuine LSP violations, where a parameter has been moved
>> to a different position.
>> 
>> I've run some static analysis to detect cases that would be affected by the
>> latter check, with these results:
>> https://gist.github.com/nikic/6cc9891381a83b8dca5ebdaef1068f4d The first
>> signature is the child method, and the second the parent method. I did not
>> put in the effort to make this completely precise, so there's both false
>> positives and false negatives here. But it should be enough for a general
>> impression. And the general impression is that these are indeed legitimate
>> LSP violations.
>> 
>> This approach would be an alternative to either silently ignoring the issue
>> (as the RFC proposed), or to warning for all parameter renames.
>> 
>> Regards,
>> Nikita
> 
> Just to make sure I follow what you're proposing, given:
> 
> class P {
>  public function foo($a, $b, $c) { ... }
> }
> 
> This is legal:
> 
> class A extends P {
>  public function foo($a2, $b, $c) {}
> }
> 
> // Mean the same thing:
> $a = (new A)->foo(a = 1, b = 2, c = 3);
> $a = (new A)->foo(a2 = 1, b = 2, c = 3);
> 
> This will parse error:
> 
> class A extends P {
>  public function foo($b, $a, $c) {}
> }
> 
> Am I following the intent correctly?
> 
> If so, that sounds like a very reasonable and safe middle-ground.
> 
> --Larry Garfield

Yes,

that's pretty much the intent - having a very small BC break surface, while 
still allowing for safe usage of named parameters according to both the child 
and parent interface.

Bob
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to