Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:110664 Return-Path: Delivered-To: mailing list internals@lists.php.net Received: (qmail 65182 invoked from network); 18 Jun 2020 17:16:37 -0000 Received: from unknown (HELO php-smtp4.php.net) (45.112.84.5) by pb1.pair.com with SMTP; 18 Jun 2020 17:16:37 -0000 Received: from php-smtp4.php.net (localhost [127.0.0.1]) by php-smtp4.php.net (Postfix) with ESMTP id 38F6D18054E for ; Thu, 18 Jun 2020 09:02:36 -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=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HTML_MESSAGE,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,SPF_NONE autolearn=no autolearn_force=no version=3.4.2 X-Spam-ASN: AS15169 209.85.128.0/17 X-Spam-Virus: No X-Envelope-From: Received: from mail-ot1-f49.google.com (mail-ot1-f49.google.com [209.85.210.49]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-256) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by php-smtp4.php.net (Postfix) with ESMTPS for ; Thu, 18 Jun 2020 09:02:35 -0700 (PDT) Received: by mail-ot1-f49.google.com with SMTP id n6so4958767otl.0 for ; Thu, 18 Jun 2020 09:02:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dqxtech-net.20150623.gappssmtp.com; s=20150623; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=jTqWwNKbCcJ5fiSosUvah1P2X4mFwCDFqgZ5pCaDffk=; b=KfToPj1fs8jxjctvmTChFgLIKPuTwB62TUfK2dDHV48xnQIxzU7aPjw6GEDanAR4Oi xg2g+ocU15yJyTemvPTgmSgji8p5B4SFseQLZG5I8o5GwLEmt1z/L0LAZs+u0f6w63yn yQhoaUwjy1PD9MpKI9L8vl1BKFNfgRY7v393sA7XzbZWgQKP3ui+R7ic8PhrIaHGfl/4 In5oq3LO/MzoftDD3f1HEXuZYWSIq5n9yxWBf8BbqD56i3zE3FSsKWFSNHx0g19K7rcf X+Os8mbNjYAgtwfogaVj0jb7N6jcY8r3q+rKNOVP7IWqgWFnmAxqKg+orrYLjoFS3VIl FGfg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=jTqWwNKbCcJ5fiSosUvah1P2X4mFwCDFqgZ5pCaDffk=; b=lOfSdvBa159RNbhQN/AfJavfXh6nUsMnxv+FAfKClsci48Wqg1U/JUlEUaTHANUnc7 OunUOVt+WulFNEqWw9TFGuOBc6b3yeGfivwrSj8MP6OkkYdt6WTTtTECQUnF16GheKRR 2tZ+Azf9r4mW2gEgPV9SeZUKrkRz/cgDZQjovQnFof4JaOkPCB5c/pgNFIwvzkrwW7n6 hOPQv9hnO+KF4vOR+BNVpsBDKCXb5KZxErzX7P/2ARzeOOuN1S9I/7bgjE9j/Mvbu69C J9vSIUscWctrbRAUwqLoIwLjEPOQRjZEBhyF0pXEgWOziywxhtZ/Ny/qt1WbTOkWspzp 9gUg== X-Gm-Message-State: AOAM531mrFfPnq9QqPGSE9uqtHssE4+B+Cdmffjs+PniDpCdwRwIl4+O ojOEqSatxsOnnMRy+BABCiW9ls0Ly0VkiuHbcNUIRg== X-Google-Smtp-Source: ABdhPJxEWrlCJuCMRcufAu69+ic9wiBVd+S0AT/kQrj2IYvSq6pyk5UBidoKnh9Aq8qcagyyOsyHQAppPSB6NiPGf/w= X-Received: by 2002:a9d:3a36:: with SMTP id j51mr4175601otc.129.1592496152505; Thu, 18 Jun 2020 09:02:32 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: Date: Thu, 18 Jun 2020 18:02:21 +0200 Message-ID: To: Benas IML Cc: Bob Weinand , PHP Internals List Content-Type: multipart/alternative; boundary="0000000000007a14e605a85de739" Subject: Re: [PHP-DEV] [RFC] [DISCUSSION] Make constructors and destructors return void From: andreas@dqxtech.net (Andreas Hennings) --0000000000007a14e605a85de739 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi The RFC introduces what I call a "meaningless choice", by making something possible that is currently illegal, but which does not change behavior. https://3v4l.org/daeEm It forces organisations, frameworks or the php-fig group to introduce yet another coding convention to decide whether or not there should be a ": void" declaration on constructors. I am ok with restricting the use of "return *;" inside a constructor. But I don't like allowing the ": void" declaration. Greetings On Thu, 18 Jun 2020 at 17:18, Benas IML wrote: > Hey Bob, > > Magic methods are **never** supposed to be called directly (even more if > that method is a constructor or a destructor). If that's not the case, it= 's > just plain bad code. But by enforcing these rules, we make sure that less > of that (bad code) is written and as a result, we make PHP code less > bug-prone and easier to debug. That's also most likely the reason why > "ensure magic methods' signature" RFC opted in to validate `__clone` > method's signature and ensure that it has `void` return type. > > Just for the sake of making sure that you understand what I mean, here ar= e > a couple of examples that show that no magic method is ever supposed to b= e > called directly: > ```php > // __toString > (string) $object; > > // __invoke > $object(); > > // __serialize > serialize($object); > ``` > > Moreover, by validating constructors/destructors and allowing an explicit > `void` return type declaration, we are becoming much more consistent > (something that PHP is striving for) with other magic methods (e. g. > `__clone`). > > Also, saying that "sometimes you have valid information to pass from the > parent class" is quite an overstatement. After analyzing most of the 95 > Composer packages that had a potential BC break, I found out that either > they wanted to return early (that is still possible to do using `return;`= ) > or they added a `return something;` for no reason. Thus, no libraries > actually returned something useful and valid from a constructor (as they > shouldn't). > > Last but certainly not least, constructors have one and only one > responsibility - to initialize an object. Whether you read Wikipedia's or > PHP manual's definition, a constructor does just that. It initializes. So= , > the PHP manual is perfectly correct and documents the correct return type > that a constructor should have. > > Best regards, > Benas > > On Thu, Jun 18, 2020, 4:06 PM Bob Weinand wrote: > > > > Am 17.06.2020 um 01:10 schrieb Benas IML : > > > > > > Hey internals, > > > > > > This is a completely refined, follow-up RFC to my original RFC. Based > on > > the > > > feedback I have received, this PR implements full validation and > > implicitly > > > enforces `void` rules on constructors/destructors while also allowing > to > > > declare an **optional** explicit `void` return type. Note, that there > is > > a > > > small but justifiable BC break (as stated by the RFC). > > > > > > RFC: https://wiki.php.net/rfc/make_ctor_ret_void > > > > > > Best regards, > > > Benas Seliuginas > > > > Hey Benas, > > > > I do not see any particular benefit from that RFC. > > > > Regarding what the manual states - the manual is wrong there and thus > > should be fixed in the manual. This is not an argument for changing > engine > > behaviour. > > > > Sometimes a constructor (esp. of a parent class) or destructor may be > > called manually. Sometimes you have valid information to pass from the > > parent class. > > With your RFC an arbitrary restriction is introduced necessitating an > > extra method instead. > > > > In general that RFC feels like "uh, __construct and __destruct are most= ly > > void, so let's enforce it =E2=80=A6 because we can"? > > > > On these grounds and it being an additional (albeit mostly small) > > unnecessary BC break, I'm not in favor of that RFC. > > > > Bob > --0000000000007a14e605a85de739--