php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #74269 It's possible to override trait property with different loosely-equal value
Submitted: 2017-03-18 20:58 UTC Modified: 2017-03-18 21:09 UTC
From: bugsphp077 at nabialek dot org Assigned:
Status: Closed Package: Class/Object related
PHP Version: 7.0.17 OS: Linux/Windows
Private report: No CVE-ID: None
 [2017-03-18 20:58 UTC] bugsphp077 at nabialek dot org
Description:
------------
According to PHP manual:

"If a trait defines a property then a class can not define a property with the same name unless it is compatible (same visibility and initial value), otherwise a fatal error is issued. Before PHP 7.0.0, defining a property in the class with the same visibility and initial value as in the trait, raised an E_STRICT notice. "

but it seems it's not completely true. Some casts are done, so in fact you can use different value.

Test script:
---------------
trait PropertiesTrait
{
    public $same = true;

    public function message()
    {
        if ($this->same === true) {
            return "A";
        }
        return "B";
    }
}

class PropertiesExample
{
    use PropertiesTrait;
    public $same = 2;
}

$example = new PropertiesExample();
echo $example->message();

Expected result:
----------------
Fatal error as described in documentation.

Actual result:
--------------
B (Same result is for PHP 7.1.1). No warning/notice is generated

Patches

Add a Patch

Pull Requests

Pull requests:

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2017-03-18 21:00 UTC] bugsphp077 at nabialek dot org
-Operating System: Windows +Operating System: Linux/Windows
 [2017-03-18 21:00 UTC] bugsphp077 at nabialek dot org
In fact it's for both Linux and Windows
 [2017-03-18 21:09 UTC] requinix@php.net
-Summary: It's possible to override trait property with different value +Summary: It's possible to override trait property with different loosely-equal value -Status: Open +Status: Verified
 [2017-03-18 21:09 UTC] requinix@php.net
The conflict detection logic uses zend_operator's compare_function, which does loose comparisons. The original RFC doesn't say whether to be strict or loose but I think the intention is that it would be strict.
 [2017-05-01 11:00 UTC] nikic@php.net
Automatic comment on behalf of mail@pmmaga.net
Revision: http://git.php.net/?p=php-src.git;a=commit;h=92124f9cdc20c6a9c22f9b54092ef945c41f2bb5
Log: Fixed bug #74269: Strict comparison of initial trait property values
 [2017-05-01 11:00 UTC] nikic@php.net
-Status: Verified +Status: Closed
 
PHP Copyright © 2001-2017 The PHP Group
All rights reserved.
Last updated: Sun Nov 19 01:31:42 2017 UTC