Bug #52301 [Bgs]: signature incompatibility warning when used with interfaces
| From: | johannes@php.net | Date: | Fri, 09 Jul 2010 18:16:04 +0000 |
| Subject: | Bug #52301 [Bgs]: signature incompatibility warning when used with interfaces | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-152248@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
Updated by: johannes@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:
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.
Previous Comments:
------------------------------------------------------------------------
[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