Bug #52301 [Bgs]: signature incompatibility warning when used with interfaces
Edit report at http://bugs.php.net/bug.php?id=52301&edit=1
ID: 52301
Updated by: colder@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] johannes@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] johannes@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
Thread (7 messages)