Re: Inconsistent class behavior and undocumented(?) BC change

From: Date: Sun, 08 Dec 2019 05:03:00 +0000
Subject: Re: Inconsistent class behavior and undocumented(?) BC change
References: 1  Groups: php.internals 
Request: Send a blank email to internals+get-107903@lists.php.net to get a copy of this message
Hi Larry, > I am not clear on why __construct() is special in this case; I believe that is the Liskok substitution principle at work, and that fact the principle does not apply to constructors. For reference: - https://softwareengineering.stackexchange.com/a/302477/9114 - https://www.sitepoint.com/constructors-and-the-myth-of-breaking-the-lsp/ -Mike > On Dec 7, 2019, at 7:27 PM, Larry Garfield <larry@garfieldtech.com> wrote: > > I am not sure if this is a bug, a feature behaving in a desired but confusing way, or a feature > behaving in a confusing and thus undesireable way. I am therefore reporting it here in order to > defer to those who know the answer to such questions better. > > Consider the following: > > class Ancestor { > public function __construct(int $a, string $b) { } > } > > class Child extends Ancestor { > public function __construct(...$args) { > parent::__construct(...$args); > } > } > > This works with no compile errors. For any other method however: > > class Ancestor { > public function doStuff(int $a, string $b) { } > } > > class Child extends Ancestor { > public function doStuff(...$args) { > parent::doStuff(...$args); > } > } > > I get: > > Warning: Declaration of Child::doStuff(...$args) should be compatible with > Ancestor::doStuff(int $a, string $b) > > I am not clear on why __construct() is special in this case; I know __construct() is special > where interfaces are concerned, but I didn't realize it was special with regards to basic > inheritance. It seems to happen regardless of the type information presented (or not). > > Is this intentional? Is there a logical way it could be made to work? Are constructors > actually wrong here? (I hope not, because it's a neat trick.) > > Additionally, according to 3v4l.org at least, the error message has changed. On 7.1-7.3, the > exact error message is: > > Warning: Declaration of Child::doStuff(int ...$args) should be compatible with > Ancestor::doStuff($a, $b) in /in/6NthP on line 15 > > On 7.4, it reports on a different line: > > Warning: Declaration of Child::doStuff(int ...$args) should be compatible with > Ancestor::doStuff($a, $b) in /in/6NthP on line 11 > > Specifically, prior to 7.4, it reports on the LAST line of the class (the closing brace). As > of 7.4 it reports on the line of the method that is inconsistent. > > I don't think this is a bad change, per se. It's actually a good change for > debugging, IMO. But I don't see it listed in the migration guide. Should it be, in case some > failure-mode tests or other automated error systems care? > > https://www.php.net/manual/en/migration74.incompatible.php > > -- > Larry Garfield > larry@garfieldtech.com > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: http://www.php.net/unsub.php >

« previous php.internals (#107903) next »