On Wed, 2014-09-17 at 16:52 +0200, Christian Stoller wrote:
> Hello all,
>
> I hope the subject is not misleading. Please look at the following code:
>
> <?php
> class A { }
>
> class B extends A { }
>
> interface C {
> function foo(A $a);
> }
Here you say "any A can be passed at argument"
> class D implements C {
> public function foo(B $b) {
here you say "only a subset of A can be passed as argument"
Thus having
function bar(C $c) {
$a = new A();
$c->foo($a);
}
might work or might not work as $c might be an instance of D. Thus
breaks the Liskov Substitution Principle
http://en.wikipedia.org/wiki/Liskov_substitution_principle
doing it the other way round would work
interface E {
function foo(B $b);
}
class F implements E {
public function foo(A $a) {
}
}
as any B satisfies the is-a requirement compared to A, so everything
valid for E::foo() is valid for F::foo(), too. Along with other subtypes
to A.
johannes
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php