Bug #76361 [Opn]: Order of extending interfaces should not matter
| From: | nikic@php.net | Date: | Thu, 05 Mar 2020 17:53:35 +0000 |
| Subject: | Bug #76361 [Opn]: Order of extending interfaces should not matter | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-225915@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=76361&edit=1
ID: 76361
Updated by: nikic@php.net
Reported by: tobias dot nyholm at gmail dot com
Summary: Order of extending interfaces should not matter
Status: Open
Type: Bug
Package: Scripting Engine problem
PHP Version: 7.2.5
Block user comment: N
Private report: N
New Comment:
This looks fairly tricky for the general case. Say you have interfaces:
interface A {
public function method(): X|Y;
}
interface B {
public function method(): Y|Z;
}
interface C extends A, B {}
Then it would be possible to satisfy both A and B with a method
public function method(): Y {}
But I'm not sure how we could really support this.
For the special case described here, it would be enough to check for compatibility in both
directions, and pick the one that is compatible. But there may be complications with variance,
because we may not be able to determine whether the methods are compatible at the time the
to-be-inherited method needs to be determined.
Previous Comments:
------------------------------------------------------------------------
[2018-05-23 12:43:39] cmb@php.net
It occurs to me that this is a duplicate of bug #67270.
------------------------------------------------------------------------
[2018-05-21 10:18:19] tobias dot nyholm at gmail dot com
Description:
------------
If an interface that extends two other interfaces, the order of those two other interfaces should
not matter.
I found this bug when I was testing solutions for PSR18 and HTTPlug. Here is an 3v4l.org: https://3v4l.org/MMCL3
This bug might be related to https://bugs.php.net/bug.php?id=63816
Test script:
---------------
<?php
declare(strict_types=1);
interface Response {}
interface Request {}
class RespImpl implements Response {}
class ReqImpl implements Request {}
interface Psr {
public function sendRequest(Request $request): Response;
}
interface Httplug {
public function sendRequest(Request $request);
}
//interface PsrBridge extends Psr, Httplug {} // does work
interface PsrBridge extends Httplug, Psr {} // does not work
class HttpClient implements PsrBridge {
public function sendRequest(Request $request): Response {
return new RespImpl();
}
}
$client = new HttpClient();
$response = $client->sendRequest(new ReqImpl());
echo $response instanceof Response ? 'OK' : 'Fail!';
Expected result:
----------------
I expect these two lines would give the same result:
interface PsrBridge extends Psr, Httplug {}
interface PsrBridge extends Httplug, Psr {}
Actual result:
--------------
Fatal error: Declaration of Httplug::sendRequest(Request $request) must be compatible with
Psr::sendRequest(Request $request): Response in /in/MMCL3 on line 22
Process exited with code 255.
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=76361&edit=1