rfc:parameter-no-type-variance
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision | ||
rfc:parameter-no-type-variance [2017/01/01 12:08] – update to include the second use case kelunik | rfc:parameter-no-type-variance [2017/01/31 07:07] – fix voting sentence kelunik | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== PHP RFC: Parameter | + | ====== PHP RFC: Parameter Type Widening |
- | * Version: 0.2 | + | * Version: 0.3 |
- | * Date: 2017-01-01 | + | * Date: 2017-01-03 |
- | * Author: Niklas Keller < | + | * Authors: Niklas Keller < |
- | * Status: | + | * Status: |
* First Published at: http:// | * First Published at: http:// | ||
- | |||
- | ===== Introduction ===== | ||
- | PHP doesn' | ||
===== Proposal ===== | ===== Proposal ===== | ||
- | This RFC proposes to allow omitting | + | PHP currently doesn' |
+ | |||
+ | This RFC proposes to allow omitting | ||
+ | |||
+ | Implementing this RFC would allow libraries to be upgraded to use type declarations in their method signatures. Currently adding types to a method of a class in a library would break any code that extends that class. | ||
+ | |||
+ | This would provide an easier upgrade path for libraries to start using scalar types, to replace manual checks being done inside the methods, without requiring an update for all sub-classes. | ||
+ | |||
+ | Another example of this being useful is '' | ||
+ | |||
+ | A change was made to the '' | ||
- | Another practical use-case is, instead of widening the accepted type, allowing parent classes to introduce type declarations and having the sub-classes still compatible, i.e. this allows libraries to be upgraded to use (scalar) type declarations instead of manual checks without requiring an update for all sub-classes. | ||
- | ==== Example | + | ==== Example ==== |
<code php> | <code php> | ||
Line 23: | Line 29: | ||
} | } | ||
- | class IterableClass extends ArrayClass { | ||
- | // This implementation also accepts Traversable. | ||
- | // Variance is already possible in this special case using " | ||
- | public function foo(iterable $foo) { /* ... */ } | ||
- | } | ||
+ | // This RFC proposes allowing the type to be widened to be untyped aka any | ||
+ | // type can be passed as the parameter. | ||
+ | // Any type restrictions can be done via user code in the method body. | ||
class EverythingClass extends ArrayClass { | class EverythingClass extends ArrayClass { | ||
- | // This implementation accepts all values. | ||
- | // Restrictions may be done via user code in the method body. | ||
- | // Variance is currently not allowed, it throws a warning if parent or child miss a type. | ||
public function foo($foo) { /* ... */ } | public function foo($foo) { /* ... */ } | ||
} | } | ||
Line 44: | Line 45: | ||
Compiles without a warning. | Compiles without a warning. | ||
- | |||
- | ==== Example 2 ==== | ||
- | Derick added a '' | ||
- | |||
- | However, this change had to be reverted, because all classes extending '' | ||
===== Backward Incompatible Changes ===== | ===== Backward Incompatible Changes ===== | ||
Line 57: | Line 53: | ||
===== Future Scope ===== | ===== Future Scope ===== | ||
- | In the future there might be full support for contra-variance / co-variance for parameters / return types. | + | Unfortunately " |
- | ===== Proposed | + | ===== Voting ===== |
Requires a 2/3 majority. | Requires a 2/3 majority. | ||
- | ===== Patches and Tests ===== | + | <doodle title=" |
- | TBD. | + | * Yes |
+ | * No | ||
+ | </ | ||
- | ===== Implementation ===== | + | Voting started on 9th of January but has been stopped due to the mailing list failures. Voting has been resumed on 11th of January and has ended on 31th of January. |
- | TBD. | + | |
- | ===== References | + | ===== Patches and Tests ===== |
- | None. | + | |
+ | * https:// |
rfc/parameter-no-type-variance.txt · Last modified: 2017/09/22 13:28 by 127.0.0.1