rfc:intersection_types
Differences
This shows you the differences between two versions of the page.
rfc:intersection_types [2016/04/28 14:21] levim Add 3v4l.org links |
rfc:intersection_types [2017/09/22 13:28] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== PHP RFC: Intersection Types ====== | ||
- | * Version: 1.0 | ||
- | * Date: 2016-04-27 | ||
- | * Author: Levi Morrison < | ||
- | * Status: Under Discussion | ||
- | * First Published at: http:// | ||
- | |||
- | ===== 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. Given this definition: | ||
- | |||
- | <PHP> | ||
- | function RecordsToList(Countable & Traversable $input): String { | ||
- | if (count($input) > 0) { | ||
- | $output = "< | ||
- | foreach ($input as $value) { | ||
- | $output .= " | ||
- | } | ||
- | $output .= "</ | ||
- | return $output; | ||
- | } else { | ||
- | return "< | ||
- | } | ||
- | } | ||
- | </ | ||
- | |||
- | This will error ([[https:// | ||
- | <PHP> | ||
- | // Argument 1 passed to RecordsToList() must be Countable and Traversable, | ||
- | echo RecordsToList([" | ||
- | </ | ||
- | |||
- | This works correctly ([[https:// | ||
- | <PHP> | ||
- | echo RecordsToList(new ArrayObject([" | ||
- | // Output: | ||
- | // <ol> | ||
- | // < | ||
- | // < | ||
- | // < | ||
- | // < | ||
- | // </ol> | ||
- | </ | ||
- | |||
- | Note that if [[rfc: | ||
- | <PHP> | ||
- | function RecordsToList(Array | (Countable & Traversable) $input): String { | ||
- | if (count($input) > 0) { | ||
- | $output = "< | ||
- | foreach ($input as $value) { | ||
- | $output .= " | ||
- | } | ||
- | $output .= "</ | ||
- | return $output; | ||
- | } else { | ||
- | return "< | ||
- | } | ||
- | } | ||
- | </ | ||
- | |||
- | When union and intersection types are in the same expression they must be grouped with parenthesis (demonstrated above). The following is invalid: | ||
- | |||
- | <PHP> | ||
- | function RecordsToList(Array | Countable & Traversable): | ||
- | // ... | ||
- | } | ||
- | </ | ||
- | |||
- | |||
- | ===== 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:// | ||
- | |||
- | 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:// | ||
- | * Announcement for discussion phase: http:// | ||
rfc/intersection_types.txt · Last modified: 2017/09/22 13:28 (external edit)