Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:111773 Return-Path: Delivered-To: mailing list internals@lists.php.net Received: (qmail 72847 invoked from network); 2 Sep 2020 00:57:03 -0000 Received: from unknown (HELO php-smtp4.php.net) (45.112.84.5) by pb1.pair.com with SMTP; 2 Sep 2020 00:57:03 -0000 Received: from php-smtp4.php.net (localhost [127.0.0.1]) by php-smtp4.php.net (Postfix) with ESMTP id 59AC9180088 for ; Tue, 1 Sep 2020 17:01:49 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on php-smtp4.php.net X-Spam-Level: X-Spam-Status: No, score=0.1 required=5.0 tests=BAYES_20,HTML_MESSAGE, HTTPS_HTTP_MISMATCH,SPF_HELO_PASS,SPF_PASS autolearn=no autolearn_force=no version=3.4.2 X-Spam-Virus: No X-Envelope-From: Received: from texthtml.net (texthtml.net [62.210.148.97]) by php-smtp4.php.net (Postfix) with ESMTP for ; Tue, 1 Sep 2020 17:01:49 -0700 (PDT) Received: by texthtml.net (Postfix, from userid 65534) id BF2313E0053; Wed, 2 Sep 2020 02:01:48 +0200 (CEST) Received: from [192.168.0.112] (stunnel_mail_1.mail_default [172.22.0.5]) (Authenticated sender: mathieu@texthtml.net) by texthtml.net (Postfix) with ESMTPA id DB6A23E0053; Wed, 2 Sep 2020 02:01:40 +0200 (CEST) To: Andreas Hennings Cc: "PHP internals (internals@lists.php.net)" Message-ID: <086db73b-63a1-0e78-1302-903b3f8c02c3@rochette.cc> Date: Wed, 2 Sep 2020 02:01:38 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.2.0 MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="------------8C33773F3DE0B3DFFCE7BBFA" Content-Language: en-US Subject: Re: [PHP-DEV] Constructor parent property promotion From: mathieu@rochette.cc (Mathieu Rochette) --------------8C33773F3DE0B3DFFCE7BBFA Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit "Andreas Hennings" andreas@dqxtech.net – August 17, 2020 7:19 PM Interesting stuff! https://wiki.php.net/rfc/constructor_promotion I see this for the first time, but I like it :) Now to your proposal. Just to make sure I understand: Would this map the parameters by name or by index? -> I assume by index, it makes more sense. if they are mapped by index it means I can’t benefit from this feature without copying all the optional parameters up to the ones I’m interested in. Which will probably be even more widespread in the future thx to the Named Paramters RFC: https://wiki.php.net/rfc/named_params#object_initialization So, I was thinking the opposite, if they are mapped by name it means I can avoid passing some the optional parameters if’m not interested in the first ones Does it map to parent constructor parameters, or to parent properties? -> I assume to parent constructor parameters, because parent properties could be private. exactly Can the 'parent' parameters be intermixed with other parameters? -> I assume yes, not allowing it would be an unnecessary limitation. that was my intent yes So if you use the 'parent' syntax, you need exactly as many parameters with 'parent' as required by the parent constructor. // Parent class class B {   public function __construct($b0, $b1) {     // The values may or may not be written to properties, it does not matter.   } } // Child class class C extends B {   public function __construct(parent $x, private $c0, parent $y, private $c1) {     // Implicit: parent::__construct($x, $y);   } } On Mon, 17 Aug 2020 at 18:46, Mathieu Rochette wrote: Hi, I’m writing a message here to receive feedback on a two ideas related to class constructors before going more in details with an RFC. I hope this is appropriate behavior for this list With the Constructor Property Promotion accepted in PHP 8, there’s a lot less of boilerplate when writing class constructors. I’m suggesting two additional ways of making thing even easier and I hope, readable. First: I’d like to be able to automatically transfer a constructor property to its parent constructor. I’m thinking of something like that: ```php class MyCommand extends Command {    public function __construct(        private Connection $connection,        parent string $name,    ) {    } } ``` This would be the equivalent of : ```php class MyCommand extends Command {    public function __construct(        private Connection $connection,        string $name,    ) {        parent::__construct($name);    } } ``` The second idea is to make the constructor body optional, the first example would now be: ```php class MyCommand extends Command {    public function __construct(        private Connection $connection,        parent string $name,    ) } ``` This would call the parent constructor automatically even if no "parent" parameter are present. I could even see this enforced by linter to avoid having logic in the constructors. If there is interest I’d like to try writing an rfc and implement it. I have not much knowledge of the php-src code but I hope this is a small enough change that I’ll be able to tackle. So, at that time if someone is interested in mentoring this little project I’d appreciate it :) regards, Mathieu -- Mathieu Rochette --------------8C33773F3DE0B3DFFCE7BBFA--