Bug #76973 [Ver->Dup]: Return type that is alias of base class' type should be compatible
Edit report at https://bugs.php.net/bug.php?id=76973&edit=1
ID: 76973
Updated by: nikic@php.net
Reported by: ayg at aryeh dot name
Summary: Return type that is alias of base class' type should
be compatible
-Status: Verified
+Status: Duplicate
Type: Bug
Package: Scripting Engine problem
Operating System: Ubuntu
PHP Version: 7.2.10
Block user comment: N
Private report: N
New Comment:
As mentioned in my previous comment, this has the same root cause as bug #76451, which is fixed in
7.4. I've verified that the code from this bug report also works in 7.4.
Previous Comments:
------------------------------------------------------------------------
[2018-10-04 18:13:28] nikic@php.net
Ah, having just checked the implementation we already do what I described. The actual issue is that
classes C and D are early-bound (at compile-time), while the class alias is registered later (at
run-time). For example, the following code works fine (or the same split across multiple files):
<?php
class A {}
class_alias( "A", "B" );
eval(<<<'CODE'
class C { function f() : A { return new A; } }
class D extends C { function f() : B { return new B; } }
CODE
);
This is a general issue of early-binding and also related to bug #76451.
------------------------------------------------------------------------
[2018-10-04 18:04:09] spam2 at rhsoft dot net
rude is such a unreadable sample - code in a style of "} }" is pure effrontery
------------------------------------------------------------------------
[2018-10-04 18:01:59] nikic@php.net
Long term this is going to be implicitly solved by proper variance support, but for now it might
make sense to handle this the same way we do for argument types, i.e. load the classes if they do
not pass the string equality checks, but only allow exact matches (no variance).
@levim: What do you think about this?
------------------------------------------------------------------------
[2018-10-04 17:59:15] nikic@php.net
Comment by spam2 at rhsoft dot net deleted. It was rude, without contributing technical insight wrt
this issue.
------------------------------------------------------------------------
[2018-10-04 17:26:14] ayg at aryeh dot name
Description:
------------
If a base class defines a method with a return type declaration, and a derived class overrides the
method, the return type in the derived class must be the same as in the base class. However, if the
return types are classes that are aliases of one another, it should be considered the same.
Currently it is not.
Test script:
---------------
<?php
class A {}
class_alias( "A", "B" );
class C { function f() : A { return new A; } }
class D extends C { function f() : B { return new B; } }
Expected result:
----------------
No error
Actual result:
--------------
PHP Fatal error: Declaration of D::f(): B must be compatible with C::f(): A in Standard input code
on line 5
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=76973&edit=1
Thread (7 messages)