After sending out the email, I found out that I replied to the wrong email,
nevermind... Sorry about that!

Best regards,
Benas

On Sun, Aug 9, 2020, 8:25 PM Benas IML <benas.molis....@gmail.com> wrote:

> Hey Chris,
>
> thanks for the RFC but I'd like to remind you that we are already past the
> feature freeze. Moreover, it seems that you don't have an actual
> implementation as well.
>
> Best regards,
> Benas
>
>
> On Sun, Aug 9, 2020, 8:15 PM Chris Riley <t.carn...@gmail.com> wrote:
>
>> Hi all,
>>
>> RFC link: https://wiki.php.net/rfc/renamed_parameters
>>
>> I have spent the weekend working on a final revision for this RFC to
>> address several of the points brought up. Specifically:
>>
>> - Cut down the scope of the RFC to only focus on delivering an opt in to
>> named parameters, with the renaming ability explicitly pushed into future
>> scope as opposed to leaving it to the RM discretion. This will allow a
>> fuller discussion on how best to support renaming going forward, be it
>> using my proposed syntax or using attributes.
>> - Focused in on the technical issues as opposed to subjective arguments
>> for/against.
>> - Added additional example of the polymorphism problem when it comes to
>> the
>> behaviour of variadics, which didn't seem to come up in the original RFC.
>> - Added resolution on dealing with the PHP standard library, as this is an
>> enhancement to the original named parameters RFC, this RFC proposes to opt
>> in the PHP standard library. There are a couple of minor changes to
>> behaviour for classes which extend built ins to make upgrading smoother.
>> - Clarified changes to reflection parameter
>> - Added alternative implementation option using attributes which will be
>> the subject of an additional voting option for those who would prefer to
>> go
>> down this route.
>>
>> I think the RFC now represents a concrete problem and solution suitable
>> for
>> voting on, but I'm going to leave discussion open for a few days in case
>> anyone has any queries on the revisions.
>>
>> Regards,
>> Chris
>>
>>
>> On Fri, 24 Jul 2020 at 12:12, Chris Riley <t.carn...@gmail.com> wrote:
>>
>> > Hi all,
>> >
>> > The named parameters RFC has been accepted, despite significant
>> objections
>> > from maintainers of larger OSS projects due to the overhead it adds to
>> > maintaining backwards compatibility as it has now made method/function
>> > parameter names part of the API; a change to them would cause a BC break
>> > for any library users who decide to use the new feature.
>> >
>> > It is likely that the way this will shake out is that some maintainers
>> > will accept the additional overhead of including parameter names in
>> their
>> > BC guidelines and others will not, this leaves users unsure if they can
>> use
>> > the new feature without storing up issues in potentially minor/security
>> > releases of the libraries they use. This is not really an ideal
>> situation.
>> >
>> > More pressing a point is that the current implementation breaks object
>> > polymorphism. Consider this example (simplified from one of my
>> codebases)
>> >
>> > interface Handler {
>> >     public function handle($message);
>> > }
>> >
>> > class RegistrationHandler implements Handler {
>> >     public function handle($registraionCommand);
>> > }
>> >
>> > class ForgottenPasswordHandler implements Handler {
>> >     public function handle($forgottenPasswordCommand);
>> > }
>> >
>> > class MessageBus {
>> >     //...
>> >     public function addHandler(string $message, Handler $handler) {
>> //... }
>> >     public function getHandler(string $messageType): Handler { //... }
>> >     public function dispatch($message)
>> >     {
>> >         $this->getHandler(get_class($message))->handle(message:
>> $message);
>> >     }
>> > }
>> >
>> > This code breaks at run time.
>> >
>> > Proposals were made for resolutions to this issue however all of them
>> > require trade offs and could potentially break existing code.
>> >
>> > My proposal to resolve these two issues is to add the ability to rename
>> > parameters with a new syntax as follows.
>> >
>> > function callBar(Foo $internalName:externalName) {
>> >     $internalName->bar();
>> > }
>> >
>> > $x = new Foo();
>> > callBar(externalName: $x);
>> >
>> > This allows both the above problems to be resolved, by renaming the
>> > internal parameter and keeping the external signature the same.
>> >
>> > I propose that the RFC would have two voting options.
>> >
>> > The first would be to implement it as proposed above, this would allow
>> any
>> > parameter to be called by name regardless of the intentions of the
>> author
>> > of the method/function and is closest to the current behaviour.
>> >
>> > The second option would be to use this syntax to make named parameters
>> in
>> > userland code explicitly opt in. As such an additional shortcut syntax
>> > would be implemented: $: to designate a named parameter. eg
>> >
>> > function callBar($:externalName) {
>> >     $externalName->bar();
>> > }
>> >
>> > $x = new Foo();
>> > callBar(externalName: $x);
>> >
>> > If a parameter is not opted in, a compile time error is raised:
>> >
>> > function callBar($externalName) {
>> >     $externalName->bar();
>> > }
>> >
>> > $x = new Foo();
>> > callBar(externalName: $x); // Error: cannot call parameter $externalName
>> > by name.
>> >
>> > There are pros and cons to this second approach, on the one hand it
>> > reduces the usefulness of the named parameter syntax by requiring
>> changes
>> > to old code to enable it (although this could probably be automated
>> fairly
>> > easily) however it does provide a neater solution to the second problem
>> in
>> > that, to prevent the runtime errors in the second issue example, every
>> > child class would need to use the rename syntax on it's parameter to
>> > prevent errors, whereas if we went down this route, the parent class
>> could
>> > just not opt into the named parameter syntax and the code would
>> function as
>> > expected.
>> >
>> > Another advantage is that with the ability to rename parameters using
>> the
>> > opt in, we gain some flexibility to tighten up the LSP rules relating to
>> > named parameter inheritance.
>> >
>> > class Foo {
>> >     public function bar($:param) { //... }
>> >     public function baz($internal:external) { //... }
>> > }
>> >
>> > // OK
>> > class Bar {
>> >     public function bar($renamed:param) { //... }
>> >     public function baz($renamed:external) { //... }
>> > }
>> >
>> > // Compile time error cannot rename named parameter $:param (renamed to
>> > $:renamedParam)
>> > class Baz {
>> >     public function bar($:renamedParam) { //... }
>> > }
>> >
>> > // Compile time error cannot rename named parameter $:external (renamed
>> to
>> > $:renamed)
>> > class Baz {
>> >     public function baz($internal:renamed) { //... }
>> > }
>> >
>> > While this would be technically possible with the first option (no opt
>> in)
>> > it would break any existing code which renames a parameter as every
>> > parameter would be subject to these rules.
>> >
>> > I don't have Wiki karma so can't post this yet; but I want to get the
>> ball
>> > rolling on discussion as feature freeze is coming up fast and if we
>> want to
>> > go for the second option, that must hit before the named parameter
>> syntax
>> > is in a tagged version of PHP.
>> >
>> > Regards,
>> > Chris
>> >
>>
>

Reply via email to