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 <la...@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
>  la...@garfieldtech.com
> 
> -- 
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
> 

Reply via email to