This is an old revision of the document!

PHP RFC: Intersection Types


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.


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.


Original announcement on Mailing List of rationale for this feature: http://news.php.net/php.internals/92252

rfc/intersection_types.1461777792.txt.gz · Last modified: 2017/09/22 13:28 (external edit)