Edit report at http://bugs.php.net/bug.php?id=52301&edit=1

 ID:               52301
 Updated by:       col...@php.net
 Reported by:      giorgio dot liscio at email dot it
 Summary:          signature incompatibility warning when used with
                   interfaces
 Status:           Bogus
 Type:             Bug
 Package:          Class/Object related
 Operating System: all
 PHP Version:      5.3.2

 New Comment:

Currently, arguments are invariant. And if not, they should be
contra-variant, but 

surely not co-variant like you want.



Your subclass is more strict that the super class which is wrong, as any
subclass 

should be able to be used as instances of the super class.


Previous Comments:
------------------------------------------------------------------------
[2010-07-09 20:58:28] giorgio dot liscio at email dot it

i think it is a bug because with abstract classes works good



abstract class A {}

abstract class X { abstract public function __construct(A $x); } // must
be at least A



class A_BASED extends A {}

class X_BASED extends X { public function __construct(A_BASED $x){} } //
it is A_BASED, so it satisfy A

------------------------------------------------------------------------
[2010-07-09 20:54:22] giorgio dot liscio at email dot it

but my A_BASED is a valid instance of A too



class A_BASED implements A {}





constructor



__construct(A_BASED $TESTTEST) {}



overrides



abstract __construct(A $TESTTEST) {}



and A_BASED instanceof A === TRUE



so i don't limit anything because all methods required by interface A
are implemented in class A_BASED

------------------------------------------------------------------------
[2010-07-09 20:15:59] johan...@php.net

interface X guarantees that any A may be passed. You limit it to
A_BASED. MyClass is a valid A but no A_BASED, so X_BASED won't accept
it, which conflicts with the promise by interface X.

------------------------------------------------------------------------
[2010-07-09 18:13:23] giorgio dot liscio at email dot it

hi johannes, please read better my example



interface A {}

interface X { public function __construct(A $x); }



class A_BASED implements A {}

class X_BASED implements X { public function __construct(A_BASED
$TESTTEST){} }



interface X

says its constructor first parameter should be "instance of A"



XBASED implements X

says its constructor first parameter should be "instance of A_BASED"

A_BASED as type hint is correct because A_BASED implements A

------------------------------------------------------------------------
[2010-07-09 17:53:23] johan...@php.net

class MyClass implements A {}

new X_BASED(new MyClass);



won't be accepted while X says MyClass would be valid as a constructor
Parameter -> contract not fullfilled. So PHP's error is correct.

------------------------------------------------------------------------


The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at

    http://bugs.php.net/bug.php?id=52301


-- 
Edit this bug report at http://bugs.php.net/bug.php?id=52301&edit=1

Reply via email to