Take the State of PHP 2026 Survey →

Deprecate returning values from __construct() and __destruct() View as Markdown

Implemented (PHP 8.6)
Authors
Tim Düsterhus, timwolla@php.net
Date
2026-05-08
Version
1.0
Implementation
https://github.com/php/php-src/pull/21982
Source
wiki.php.net/rfc/deprecate-return-value-from-construct

Vote

Deprecate returning values from __construct() and __destruct()? closed
Yes
39
No
0
Abstain
0
39 voters
alcaeus Yes 2026-06-15 16:04
alec Yes 2026-06-15 13:26
alexandredaubois Yes 2026-06-18 13:56
ayesh Yes 2026-06-15 14:25
brzuchal Yes 2026-06-15 18:39
crell Yes 2026-06-15 15:10
dams Yes 2026-06-15 15:31
daniels Yes 2026-06-24 00:04
dharman Yes 2026-06-20 22:54
dragoonis Yes 2026-06-17 14:15
duncan3dc Yes 2026-06-17 08:56
dunglas Yes 2026-06-15 23:28
enorris Yes 2026-06-15 13:56
galvao Yes 2026-06-17 09:36
girgias Yes 2026-06-22 11:01
heiglandreas Yes 2026-06-18 07:07
iliaa Yes 2026-06-15 13:14
ilutov Yes 2026-06-18 08:36
jordikroon Yes 2026-06-15 13:22
josh Yes 2026-06-24 08:04
kalle Yes 2026-06-15 16:07
kocsismate Yes 2026-06-17 09:49
levim Yes 2026-06-16 21:37
marandall Yes 2026-06-18 20:34
mauricio Yes 2026-06-22 16:19
mbeccati Yes 2026-06-15 14:08
ocramius Yes 2026-06-15 13:13
pmjones Yes 2026-06-15 13:48
ramsey Yes 2026-06-15 18:34
rasmus Yes 2026-06-15 14:43
sebastian Yes 2026-06-15 13:23
sergey Yes 2026-06-15 20:01
shivam Yes 2026-06-25 04:35
theodorejb Yes 2026-06-15 14:09
thorstenr Yes 2026-06-16 13:45
timwolla Yes 2026-06-15 13:07
trowski Yes 2026-06-15 21:06
weierophinney Yes 2026-06-28 14:37
weilindu Yes 2026-06-17 14:45

Discussions on the mailing list

[PRE-RFC] Deprecate returning from a finally block
by Osama Aldemeery · 10 messages

RFC text

Copied from wiki.php.net, last synchronized Oct 13, 2026 11:50 UTC

Introduction

A class’ constructor and destructor (“Lifecycle Functions”) are special in that they are not meant to be used like regular methods and called manually. Observing the return value during intended use is not possible.

To that effect they are already restricted from declaring any return type at all, including declaring a return type of void. It however is nevertheless legal to return a value from these methods, which can be confusing, particularly when returning a separate valid object instance from __construct().

Proposal

Deprecate returning values from __construct() and __destruct(). Using return …; shall emit a compile-time deprecation. Using return; without an expression to “skip” over the remaining logic shall remain legal. Since Generators effectively return a new Generator object, making __construct() and __destruct() a Generator shall also be deprecated. Starting with the next major version, returning a value shall emit a compile-time error.

<?php
 
class Foo
{
	public function __construct()
	{
		return 123; // Deprecated: Returning a value from a constructor is deprecated in test.php on line 6
	}
 
	public function __destruct()
	{
		return 123; // Deprecated: Returning a value from a constructor is deprecated in test.php on line 12
	}
}
 
class Bar
{
	public function __construct()
	{
		if (random_int(0, 1)) {
			return; // Skipping the rest of the logic remains legal.
		}
 
		echo "Constructing", PHP_EOL;
	}
}
 
class Baz
{
	public function __construct()
	{
		yield 123; // Deprecated: Making a constructor a Generator is deprecated in test.php on line 30
	}
 
	public function __destruct()
	{
		yield 123; // Deprecated: Making a destructor a Generator is deprecated in test.php on line 35
	}
}

This deprecation is in line with the existing error when returning a value from a void function:

<?php
 
function void_function(): void
{
	return 123; // Fatal error: A void function must not return a value in test.php on line 5
}

It will remain legal to manually call __construct() and __destruct(), for example to call a parent constructor or destructor - or to initialize a lazy object.

Backward Incompatible Changes

The deprecation itself is not a backwards incompatible change. When it is turned into an error, code that returns values will stop working. The justification is provided in the introduction.

Proposed PHP Version(s)

Deprecation in the next PHP version (8.6). Removal in the first major after that.

RFC Impact

To the Ecosystem

Static analyzers and IDEs will want to point out:

  • Cases where a value is returned from a constructor or destructor.
  • Cases where yield is used in a constructor or destructor.
  • Cases where the return value of a constructor or destructor is used.

An analysis of the top 4000 composer packages run by Juliette Reinders Folmer with PHP_CodeSniffer revealed a total of 77 return statements with a value across 59 files and 36 packages. 2 of the return statements were inside __destruct(). 21 were of the form return $this;. One returned the value of a static property containing a non-$this object.

This indicates that albeit rare, there appears to be some misunderstanding of how constructors and destructors work in PHP that can be cleared up by deprecating this behavior.

To Existing Extensions

None.

To SAPIs

None.

Open Issues

None.

Future Scope

Similar arguments apply to __clone(). However in that case specifying an explicit return type of void is legal. __clone() will therefore implicitly be handled if / when magic methods are required to specify accurate return (and parameter) types.

Voting Choices

Primary Vote requiring a 2/3 majority to accept the RFC:

Vote: Deprecate returning values from __construct() and __destruct()? — Yes: 39 · No: 0 · Abstain: 0 (closed)

Patches and Tests

https://github.com/php/php-src/pull/21982

Implementation

References

Rejected Features

None.

Changelog

  • 2026-05-29: Include top 4000 composer packages analysis in RFC Impact section
  • 2026-05-29: Mention that making __construct and __destruct a Generator will also be deprecated
  • 2026-05-08: Initial version