AW: [PHP-DEV] Allow dropping typehints during inheritance
| From: | Robert Stoll | Date: | Thu, 05 Feb 2015 12:16:29 +0000 |
| Subject: | AW: [PHP-DEV] Allow dropping typehints during inheritance | ||
| References: | 1 2 3 4 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-81909@lists.php.net to get a copy of this message | ||
> -----Ursprüngliche Nachricht-----
> Von: julienpauli@gmail.com [mailto:julienpauli@gmail.com] Im Auftrag von Julien Pauli
> Gesendet: Donnerstag, 5. Februar 2015 13:10
> An: Andrea Faulds
> Cc: Hannes Magnusson; Nikita Popov; PHP internals
> Betreff: Re: [PHP-DEV] Allow dropping typehints during inheritance
>
> On Thu, Feb 5, 2015 at 2:08 AM, Andrea Faulds <ajf@ajf.me> wrote:
>
> > Hi Hannes,
> >
> > > On 4 Feb 2015, at 23:58, Hannes Magnusson
> > > <hannes.magnusson@gmail.com>
> > wrote:
> > >
> > > So what it supports "more inputs"?
> > > It does constitute an LSP violation. "more inputs" is not what the
> > > guarantee is at all, if that is what you want you'd typehint on a
> > > interface.
> > >
> > >
> > > It is a LSP failure to allow a string, or any other scalar value,
> > > when the parent requires a specific type/object.
> > >
> > > It sucks that we fail our arginfo very frequently, but this is the
> > > way
> > it is :]
> >
> > An interface requires only a minimum standard for accepted input. If a
> > class implementing that interface allows a wider range of values, but
> > still allows at least what the interface requires it to, it is not an
> > LSP violation. Scalars are not special.
> >
>
> If we allow larger type, why doesn't such code work ?
>
> interface A { }
> interface B extends A { }
>
> class C {
> public function foo(A $a) { }
> }
>
> class D extends C {
> public function foo(B $a) { } // E_STRICT }
>
> This is wrong IMO.
>
>
> Julien.P
Because this would be covariance and violates LSP. Considering the following:
function foo(C $c){
$c->foo(new A);
}
if you substitute C with D then suddenly the code would not work anymore.
Cheers,
Robert