[RFC] [Vote] Type Guards for Classes
| From: | Patrik Václavek | Date: | Thu, 16 May 2024 20:31:10 +0000 |
| Subject: | [RFC] [Vote] Type Guards for Classes | ||
| Groups: | php.internals | ||
| Request: | Send a blank email to internals+get-123324@lists.php.net to get a copy of this message | ||
Introduction
*************
This RFC proposes a new feature in PHP: type guards for classes (or
interfaces). This feature aims to simplify and standardize the process of
verifying that a variable is an instance of a specific class, enhancing code
readability and reducing boilerplate code.
Motivation
*************
Currently, in PHP, to ensure that a variable is an instance of a specific
class, developers need to use the
instanceof operator and manually throw
an exception if the check fails. This results in repetitive boilerplate code
scattered throughout the codebase. A new syntax, (ClassName) $variable, is
proposed to streamline this process by performing an instanceof check and
throwing a TypeError if the variable is not an instance of the specified
class.
Proposal
***********
Introduce a new type guard syntax for classes:
```php
(Foo) $variable;
```
This syntax will internally perform the following operations:
1. Check if $variable is an instance of Foo.
2. If the check fails, throw a TypeError with a message indicating the
expected and actual types.
Example:
Consider the following class definition:
```php
class Foo {
// class definition
}
```
To ensure a variable is an instance of Foo, instead of writing:
```php
if (!$variable instanceof Foo) {
throw new TypeError('Expected instance of Foo, got ' . gettype($
variable));
}
```
Developers can use the new type guard syntax:
```php
(Foo) $variable;
```
Backward Compatibility
***************************
This feature introduces new syntax and does not affect existing code. It is
fully backward-compatible, as it does not modify or deprecate any existing
functionality.