This is an old revision of the document!
PHP RFC: Mixed typehint
- Version: 1.1
- Date: 2017-07-19
- Author: Michael Moravec (php.net@majkl578.cz)
- Status: Under Discussion
- First Published at: http://wiki.php.net/rfc/mixed-typehint
Introduction
With the addition of scalar types in PHP 7, nullables in 7.1 and recently object in 7.2, it's now possible to explicitly declare accepted types for most of the parameters and return types. Unfortunately without mixed type it's still not possible to achieve a fully type hinted and consistent code using simple types.
Proposal
This RFC proposes to add the mixed
type to be used for parameter and return types to explicitly declare desired type, instead of being forced to not declare anything.
Primary motivation for having explicit mixed type is consistence and easier static analysis. In PHP 7.2, mixed types are unfortunately the only type that could not be type hinted upon (and resource as well, but its future is unclear). Having mixed type would allow a code with 100% type coverage in most cases.
The behavior of the mixed
type fully matches the behavior when nothing is specified for parameter or return type (thus being implicitly mixed), effectively being an alias for previous behavior.
Nullability
As the mixed
is a union type that accepts any type, including null, nullable mixed type (?mixed
) is disabled at compile time as null
is implied.
function foo() : ?mixed {} // Fatal error
Variance
No changes to variance needed. Exactly same rules as when no type is present apply.
Since the mixed
type and no type are functionally (not semantically) equivalent, the following code is functionally (but not semantically) equivalent as well:
function foo($arg) { return $arg; }
and
function foo(mixed $arg): mixed { return $arg; }
Same rules apply to inheritance, where mixed type and no type could be interchanged without any error. This code would work just fine:
class Foo { public function test(mixed $arg): mixed { return $arg; } } class Bar extends Foo { public function test($arg) { return parent::test($arg); } } class Baz extends Bar { public function test(mixed $arg): mixed { return parent::test($arg); } }
Mixed vs. Void
As of PHP 7.1, PHP has a special void
type. Void
is not a regular type and is only valid for return types to specify that nothing is returned.
In some other languages like C/C++ void*
can also be used as a type that accepts any type.
This essentially matches the behavior of mixed
in PHP.
As void is not a real type in PHP, it is not part of mixed
type.
Should there ever be a type that includes all types and void
, it would be supertype of mixed
and void
, i.e. any
.
Backward Incompatible Changes
None, mixed
is already reserved word since PHP 7.0.
Variance behavior is same as when no type is specified.
Proposed PHP Version(s)
7.3
RFC Impact
To SAPIs
None.
To Existing Extensions
None.
To Opcache
Not analyzed, likely none (no changes to current language behavior).
Unaffected PHP Functionality
No changes to type cast operators.
Proposed Voting Choices
Simple yes/no vote to either accept or reject addition of mixed type. As this is a language change, 2/3 majority is required.