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