rfc:intersection_types

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
rfc:intersection_types [2016/04/27 17:23]
levim created
rfc:intersection_types [2017/09/22 13:28] (current)
Line 3: Line 3:
   * Date: 2016-04-27   * Date: 2016-04-27
   * Author: Levi Morrison <​levim@php.net>​   * Author: Levi Morrison <​levim@php.net>​
-  * Status: ​Draft+  * Status: ​Under Discussion
   * First Published at: http://​wiki.php.net/​rfc/​intersection_types   * First Published at: http://​wiki.php.net/​rfc/​intersection_types
  
Line 12: Line 12:
 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 (''&''​). 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:+Here is a practical example. Given this definition:
  
 <PHP> <PHP>
Line 28: Line 28:
 } }
 </​PHP>​ </​PHP>​
 +
 +This will error ([[https://​3v4l.org/​qCeXi/​rfc#​rfc-multi-types|see on 3v4l.org]]):​
 +<PHP>
 +// Argument 1 passed to RecordsToList() must be Countable and Traversable,​ array given
 +echo RecordsToList(["​Lennon",​ "​McCartney",​ "​Starr",​ "​Harrison"​]);​
 +</​PHP>​
 +
 +This works correctly ([[https://​3v4l.org/​7GvqN/​rfc#​rfc-multi-types|see on 3v4l]]):
 +<PHP>
 +echo RecordsToList(new ArrayObject(["​Lennon",​ "​McCartney",​ "​Starr",​ "​Harrison"​]));​
 +// Output:
 +// <ol>
 +//     <​li>​Lennon</​li>​
 +//     <​li>​McCartney</​li>​
 +//     <​li>​Starr</​li>​
 +//     <​li>​Harrison</​li>​
 +// </ol>
 +</​PHP>​
 +
 +Note that if [[rfc:​union_types|Union Types]] are also accepted then something like this will be possible((The experimental patch provided by Joe and Bob currently does not support mixing unions and intersections)),​ allowing for an array or an object that satisfies both Countable and Traversable:​
 +<PHP>
 +function RecordsToList(Array | (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";​
 +    }
 +}
 +</​PHP>​
 +
 +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 $input): String {
 +    // ...
 +}
 +</​PHP>​
 +
  
 ===== Backward Incompatible Changes ===== ===== Backward Incompatible Changes =====
Line 47: Line 90:
  
 ===== References ===== ===== References =====
-Original announcement on Mailing List of rationale for this feature: http://​news.php.net/​php.internals/​92252+  * Original announcement on Mailing List of rationale for this feature: http://​news.php.net/​php.internals/​92252 
 +  * Announcement for discussion phase: http://​news.php.net/​php.internals/​92857
  
rfc/intersection_types.1461777792.txt.gz · Last modified: 2017/09/22 13:28 (external edit)