|  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Request #76312 Returning anything in a constructor/destructor/__clone should error
Submitted: 2018-05-08 16:21 UTC Modified: 2021-08-27 11:21 UTC
Avg. Score:5.0 ± 0.0
Reproduced:1 of 1 (100.0%)
Same Version:1 (100.0%)
Same OS:1 (100.0%)
From: Assigned: cmb (profile)
Status: Wont fix Package: Class/Object related
PHP Version: 7.2.5 OS:
Private report: No CVE-ID: None
View Add Comment Developer Edit
Welcome! If you don't have a Git account, you can't do anything here.
You can add a comment by following this link or if you reported this bug, you can edit this bug over here.
Block user comment
Status: Assign to:
Bug Type:
New email:
PHP Version: OS:


 [2018-05-08 16:21 UTC]
Given that __construct and __destruct do not have return types, PHP should raise an error if the user attempts to return a value. Currently it is allowed but the values are ignored. Naturally an empty return should still be allowed.

Targeting only master/7.3+ is fine.

Request or bug? Feels to me like 51% feature request and 49% bug report.

Backwards compatibility? Some quick searches on found some constructors returning values, such as false (private constructors) or $this.

Test script:

class Foo {
    public function __construct() {
        return 123;
    public function __destruct() {
        return 456;

Expected result:
Either E_PARSEs or E_WARNINGs. Should be the same one for both methods.

Possibly E_WARNING or E_NOTICE when __construct returns $this: it's understandable but still technically wrong.


Add a Patch

Pull Requests

Add a Pull Request


AllCommentsChangesGit/SVN commitsRelated reports
 [2018-05-08 16:28 UTC]
Actually E_PARSE wouldn't be right.

function(): void { return 123; }

That will fatal with an E_COMPILE_ERROR, so if this went into 7.3+ then it should be the same level. If it went for 7.1 and 7.2 too then an E_COMPILE_WARNING would probably be better, but given the choice I would rather wait for 7.3 and have it be fatal.
 [2018-05-08 16:34 UTC]
I recommend an E_DEPRECATED for 7.3 and for a fatal in PHP 8.0. This issue has been around for a very long time (appears to be 5.0) and see no value in breaking this suddenly in 7.X.

I'm willing to prepare a patch if this is agreeable.
 [2018-05-08 16:42 UTC]
I'm okay with that. I thought a shorter timeframe would be excusable, but following the proper sequence of deprecate now and break later is a safer approach.
 [2018-05-08 16:49 UTC]
-Summary: Returning anything in a constructor/destructor should error +Summary: Returning anything in a constructor/destructor/__clone should error
 [2018-05-08 16:49 UTC]
See also bug #76311, where I just realized this applies to __clone too.
 [2021-08-27 11:21 UTC]
-Status: Open +Status: Wont fix -Assigned To: +Assigned To: cmb
 [2021-08-27 11:21 UTC]
For __clone(), it is now allowed to specify void as return type,
what will catch any return value.

For __construct() and __destruct(), there was a respective RFC[1],
but that had been declined, so this ticket can be closed.

[1] <>
PHP Copyright © 2001-2021 The PHP Group
All rights reserved.
Last updated: Tue Oct 26 03:03:35 2021 UTC