php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Doc Bug #78677 Parameter Type Widening not properly documented
Submitted: 2019-10-17 07:41 UTC Modified: 2019-10-17 14:20 UTC
From: pavel at bunaev dot ru Assigned:
Status: Verified Package: Class/Object related
PHP Version: 7.2.23 OS: 18.04.1-Ubuntu
Private report: No CVE-ID: None
Have you experienced this issue?
Rate the importance of this bug to you:

 [2019-10-17 07:41 UTC] pavel at bunaev dot ru
Description:
------------
The interface allows you to change the type of variable in an incompatible direction.

In versions php 7.0+ and 7.1-, we could specify in the interface with what types of data we will work in the method.
And at the kernel level, be sure that by implementing the interface the signature will not change.

In version php 7.2+ and 7.3+, this has changed and there was no announcement ..
We can create an interface and expect in the signature that the method will work with certain arguments

but in fact we can transfer anything


OS linux
version php 7.2+

version php 7.1- is ok


Test script:
---------------
<?php
interface IBaz {};
interface IFoo {
    public function simple(IBaz $a);
}

class CFoo implements IFoo {
    public function simple($a){
        var_dump($a);
    }
}

$cFoo = new CFoo();
$cFoo->simple('vbvc');

Expected result:
----------------
<br />
<b>Fatal error</b>:  Declaration of CFoo::simple($a) must be compatible with IFoo::simple(IBaz $a) in <b>[...][...]</b> on line <b>7</b><br />

Actual result:
--------------
string(4) "vbvc"

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2019-10-17 08:02 UTC] cmb@php.net
-Status: Open +Status: Not a bug -Assigned To: +Assigned To: cmb
 [2019-10-17 08:02 UTC] cmb@php.net
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to report
a bug at http://bugs.php.net/how-to-report.php

See <https://www.php.net/manual/en/migration72.new-features.php#migration72.new-features.param-type-widening>.
 [2019-10-17 08:04 UTC] sjon@php.net
-Summary: Interface declaration of ... unexpected behavior +Summary: Parameter Type Widening not properly documented -Status: Not a bug +Status: Open -Type: Bug +Type: Documentation Problem -Package: *Programming Data Structures +Package: Class/Object related -Assigned To: cmb +Assigned To:
 [2019-10-17 08:04 UTC] sjon@php.net
While this might be documented better, this is definitely not a bug, see 

https://wiki.php.net/rfc/parameter-no-type-variance
 [2019-10-17 08:05 UTC] sjon@php.net
@cmb shouldn't this functionality also be documented on https://www.php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration ?
 [2019-10-17 09:12 UTC] cmb@php.net
Well, there is a note in the Interfaces section[1], but this is
only correct for PHP 7.2 and up (and even too general for 7.2),
and it doesn't cater to inheritance in general.  It seems to me
that this should be documented in the Inheritance section[2]; we
could link to that section from other parts of the manual where
appropriate.

[1] <https://www.php.net/manual/en/language.oop5.interfaces.php>
[2] <https://www.php.net/manual/en/language.oop5.inheritance.php>
 [2019-10-17 10:53 UTC] pavel at bunaev dot ru
-Status: Open +Status: Closed
 [2019-10-17 10:53 UTC] pavel at bunaev dot ru
Indeed, this is not a bug.
Somehow I missed this point in the documentation :(

I apologize for wasting your time in vain

Thanks for the clarification.
 [2019-10-17 14:20 UTC] sjon@php.net
-Status: Closed +Status: Verified
 [2019-10-17 14:20 UTC] sjon@php.net
reopening as a documentation bug
 
PHP Copyright © 2001-2019 The PHP Group
All rights reserved.
Last updated: Wed Nov 13 14:01:29 2019 UTC