php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #74862 Unable to clone instance when private __clone defined
Submitted: 2017-07-06 04:23 UTC Modified: 2017-10-05 11:09 UTC
From: daniel at ciokix dot ro Assigned:
Status: Closed Package: Scripting Engine problem
PHP Version: 7.0.24 OS: Ubuntu 14.04
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: daniel at ciokix dot ro
New email:
PHP Version: OS:

 

 [2017-07-06 04:23 UTC] daniel at ciokix dot ro
Description:
------------
When defining the __clone magic method as private, the instance cannot be cloned from within the method implementing parent class.

Test script:
---------------
class a {
    private function __clone()
    {
        
    }
    
    private function __construct()
    {
        
    }
    
    public static function getInstance()
    {
        return new static();
    }
    
    public function cloneIt()
    {
        $a = clone $this;
        
        return $a;
    }
}

class c extends a {

}

// private constructor
$d = c::getInstance();

// private clone
$e = $d->cloneIt();

Link to 3v4l: https://3v4l.org/bWr72

Expected result:
----------------
Expecting the same behavior as for __construct: a successfully cloned object.

Actual result:
--------------
The following misleading fatal error is thrown:
Fatal error: Uncaught Error: Call to private c::__clone() from context 'a'

which is not the case as clone is called from a context and not c.

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2017-07-06 06:36 UTC] spam2 at rhsoft dot net
the only probably bug here is that you don't get a error message that you can't set arbitrary magic methods as private like you get it for __construct() and __get() but given that PHP5 is EOL I won't expect that to change
 [2017-10-05 11:09 UTC] nikic@php.net
-Status: Open +Status: Verified -PHP Version: 5.6.30 +PHP Version: 7.0.24
 [2017-11-15 22:02 UTC] nikic@php.net
Automatic comment on behalf of daniel@ciochiu.ro
Revision: http://git.php.net/?p=php-src.git;a=commit;h=dba5a798a28482ce4a6475cc4de1586f11126175
Log: Fixed #74862: Unable to clone instance when private __clone defined
 [2017-11-15 22:02 UTC] nikic@php.net
-Status: Verified +Status: Closed
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Thu Nov 21 11:01:29 2024 UTC