Re: Inconsistent class behavior and undocumented(?) BC change
| From: | Mike Schinkel | 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
>