Bug #52301 [Com]: signature incompatibility warning when used with interfaces

From: Date: Fri, 09 Jul 2010 18:54:23 +0000
Subject: Bug #52301 [Com]: signature incompatibility warning when used with interfaces
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-152249@lists.php.net to get a copy of this message
Edit report at http://bugs.php.net/bug.php?id=52301&edit=1

 ID:               52301
 Comment by:       giorgio dot liscio at email dot it
 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:

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


Previous Comments:
------------------------------------------------------------------------
[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.

------------------------------------------------------------------------
[2010-07-09 17:23:24] giorgio dot liscio at email dot it

Description:
------------
hi, test this:

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

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


interface X says that the first parameter of the constructor must be
instanceof A

X_BASED implementation has a constructor with first parameter A_BASED

so, this warning is not correct:

Fatal error: Declaration of X_BASED::__construct() must be compatible
with that of X::__construct()

because

"A_BASED implements A"



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



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


Thread (7 messages)

« previous php.bugs (#152249) next »