Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:110665 Return-Path: Delivered-To: mailing list internals@lists.php.net Received: (qmail 70005 invoked from network); 18 Jun 2020 17:47:48 -0000 Received: from unknown (HELO php-smtp4.php.net) (45.112.84.5) by pb1.pair.com with SMTP; 18 Jun 2020 17:47:48 -0000 Received: from php-smtp4.php.net (localhost [127.0.0.1]) by php-smtp4.php.net (Postfix) with ESMTP id 812491804CE for ; Thu, 18 Jun 2020 09:33:43 -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=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,HTML_MESSAGE, RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_PASS 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-lj1-f175.google.com (mail-lj1-f175.google.com [209.85.208.175]) (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:33:43 -0700 (PDT) Received: by mail-lj1-f175.google.com with SMTP id z9so7990268ljh.13 for ; Thu, 18 Jun 2020 09:33:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=0+hzHBljoPzNJOR0zXxlge8XucdzUKpn4V5uQbYtdtM=; b=JE6J7Vlkn06lmpo/woU65uTrWRT2JD365FsRN0R3sE7AYw95fxySfZnacrU/v+Uk+w ifHFZAG43WtIHk8fhuH1HWG/by43zitF4JvTqiiOQgH0PFnesmVKQBvJmutfAMYyl01k fboqvtXdlBrlMlIjJppaTlxMFVu8QIrTkDxflYMcvFhbIUJHmubQLnUB7tw/Hii0ZE50 ytYrtJVbh4JkjgVWkzES1lOlxrOlD3j80sG4nRhn3Yp1CEM8qgBlC4zE7R1d5v2qRCuw Cj6tvNIoCt4jBeY81qNJGeV9l/IAuzXSYCstGX9PFi1p1tJ0FLxyj6KlN5x6P6Rqt5OD 38IQ== 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=0+hzHBljoPzNJOR0zXxlge8XucdzUKpn4V5uQbYtdtM=; b=LP9x1fpDrO64pqdY0yFjRe4gmhBCl7szDbIqPc7tQpwB1a3A5rF+b6o9SrMhmWBDHL BgP0JO6ZgB3IcgXE+HT7GGfJcnb1H6jbTgaNzBxfCf4dS/sTUnIVuJ5t6qI94R+kZ4eC M1zVDNbIvT3JexwotedIP14cR9Sd2POV81zbhnEkCOwfsXpRHCZBQMMiTrDg3I4m7et6 RM1pJB4NaAOZVhlyK2mOcQireF47J56lxcw04363+f/xISM1etORrqcjnVomV/BjLZei qLRC7nnDmnMFZxSfAaNWyy5GpHSQrH4C35Y/FH/nMgBMoxGMv9pDq9j8rKOzLaMyiBiP woSA== X-Gm-Message-State: AOAM5306LYhoYwCOFFPQKbqYt6aVM2obpZoZ/kVEdqlxwFUKCdDa3Aid S8mitv3oBBstLvwwXoXgZAZgpe3VuNQXTweLD1dHKpoO X-Google-Smtp-Source: ABdhPJzzdDzG9VuLBVsxL3G1Cx3Ya8l6MonJqKKqJXlxusPuoJbmhuOoIAz7uOMFw30ySslqYUyL4vcaKnB+X1QyrxU= X-Received: by 2002:a2e:98cb:: with SMTP id s11mr2663148ljj.402.1592498020011; Thu, 18 Jun 2020 09:33:40 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: Date: Thu, 18 Jun 2020 19:33:26 +0300 Message-ID: To: Andreas Hennings Cc: Bob Weinand , PHP Internals List Content-Type: multipart/alternative; boundary="000000000000c9d27105a85e56a8" Subject: Re: [PHP-DEV] [RFC] [DISCUSSION] Make constructors and destructors return void From: benas.molis.iml@gmail.com (Benas IML) --000000000000c9d27105a85e56a8 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hey Andreas, That is incorrect. Adding an explicit `: void` does change behavior since only then the check (whether something is being returned) is enforced. This allows PHP 8 projects to take advantage of this enforcement while being respective to older codebases. And well, the explicit `: void` declaration also helps your code to be more consistent with other methods ;) Without an explicit `: void` return type declaration, `void` rules are not enforced on constructors/destructors and will not be until PHP 9.0 (which will probably release in 5 years). Moreover, saying "it forces organisations, frameworks or the php-fig group to introduce yet another coding convention" is a complete exaggeration. In fact, even now there are no PSR conventions that specify how and when to write parameter/return/property type hints. Also, it's important to understand that PHP libraries are really really slow at starting to **depend** on new PHP versions. It will probably take a few good years (if not more) until first few libraries start requiring PHP 8.0. As a matter of fact, even Symfony framework is still requiring PHP 7.2.5 and cannot take advantage of its newer features (e. g. typed properties). Last but not least, just to reiterate, the `: void` return type is optional and you don't need to specify it. Best regards, Benas On Thu, Jun 18, 2020, 7:02 PM Andreas Hennings wrote: > Hi > > The RFC introduces what I call a "meaningless choice", by making somethin= g > 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 les= s >> 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 a= re >> a couple of examples that show that no magic method is ever supposed to = be >> called directly: >> ```php >> // __toString >> (string) $object; >> >> // __invoke >> $object(); >> >> // __serialize >> serialize($object); >> ``` >> >> Moreover, by validating constructors/destructors and allowing an explici= t >> `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 o= r >> PHP manual's definition, a constructor does just that. It initializes. S= o, >> the PHP manual is perfectly correct and documents the correct return typ= e >> 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. Base= d >> on >> > the >> > > feedback I have received, this PR implements full validation and >> > implicitly >> > > enforces `void` rules on constructors/destructors while also allowin= g >> to >> > > declare an **optional** explicit `void` return type. Note, that ther= e >> 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 >> mostly >> > 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 >> > --000000000000c9d27105a85e56a8--