This is an old revision of the document!
PHP RFC: Intersection Types
- Version: 1.0
- Date: 2016-04-27
- Author: Levi Morrison levim@php.net
- Status: Draft
- First Published at: http://wiki.php.net/rfc/intersection_types
Introduction
Sometimes multiple behaviors are necessary for a routine to be able to do its job but there is no common interface for those behaviors. Sometimes a common interface can be extracted, but this is not doable in third-party code. This RFC proposes a way to define types that must satisfy multiple types.
Proposal
Intersection types allow the programmer to write multiple type declarations for a parameter or return value. The value must satisfy all of the declared types. Each type is separated by ampersand (&
).
Here is a practical example:
function RecordsToList(Countable & Traversable $input): String { if (count($input) > 0) { $output = "<ol>\n"; foreach ($input as $value) { $output .= "\t<li>" . htmlentities($value) . "</li>\n"; } $output .= "</ol>\n"; return $output; } else { return "<p>No items to display.</p>\n"; } }
Backward Incompatible Changes
There are no known backwards compatibility breaks.
Proposed PHP Version(s)
This feature is proposed for PHP 7.1.
Open Issues
Make sure there are no open issues when the vote starts!
Proposed Voting Choices
This feature will have a simple Yes/No vote requiring two-thirds in the affirmative.
Patches and Tests
A proof of concept patch has been provided by Joe Watkins and Bob Weinand: https://github.com/php/php-src/pull/1887
Note there are multiple features contained in this patch, such as union types.
References
Original announcement on Mailing List of rationale for this feature: http://news.php.net/php.internals/92252