rfc:closures_in_const_expr
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
rfc:closures_in_const_expr [2024/10/25 10:11] – timwolla | rfc:closures_in_const_expr [2024/11/13 13:35] (current) – Voting timwolla | ||
---|---|---|---|
Line 2: | Line 2: | ||
* Version: 1.0 | * Version: 1.0 | ||
* Date: 2024-10-24 | * Date: 2024-10-24 | ||
- | * Author: Tim Düsterhus, tim@tideways-gmbh.com | + | * Author: Tim Düsterhus |
- | * Status: | + | * Status: |
* First Published at: https:// | * First Published at: https:// | ||
Line 11: | Line 11: | ||
As Closures are effectively just PHP source code (or rather: PHP Opcodes) they are an immutable value (when limiting some of the features) and as such there is no fundamental reason why they should not be allowed within constant expressions. And indeed there are some use cases that would be enabled by allowing Closures to appear in constant expressions. | As Closures are effectively just PHP source code (or rather: PHP Opcodes) they are an immutable value (when limiting some of the features) and as such there is no fundamental reason why they should not be allowed within constant expressions. And indeed there are some use cases that would be enabled by allowing Closures to appear in constant expressions. | ||
+ | |||
+ | As an example, it would enable a userland definition of < | ||
+ | |||
+ | <PHP> | ||
+ | <?php | ||
+ | |||
+ | function my_array_filter( | ||
+ | array $array, | ||
+ | Closure $callback = static function ($item) { return !empty($item); | ||
+ | ) { | ||
+ | $result = []; | ||
+ | |||
+ | foreach ($array as $item) { | ||
+ | if ($callback($item)) { | ||
+ | $result[] = $item; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | return $result; | ||
+ | } | ||
+ | |||
+ | var_dump(my_array_filter([ | ||
+ | 0, 1, 2, | ||
+ | '', | ||
+ | ])); | ||
+ | |||
+ | ?> | ||
+ | </ | ||
===== Proposal ===== | ===== Proposal ===== | ||
Line 17: | Line 45: | ||
* Attribute parameters. | * Attribute parameters. | ||
- | * Default values of properties, parameters, | + | * Default values of properties and parameters. |
* Constants and Class Constants. | * Constants and Class Constants. | ||
- | |||
- | The primary use case is making Closures legal within attribute parameters, the other constructs restricted to constant expressions will implicitly work and this RFC makes no effort to arbitrarily limit Closures to attribute parameters only. | ||
==== Constraints ==== | ==== Constraints ==== | ||
Line 26: | Line 52: | ||
If Closures are placed in constant expressions they are subject to the following constraints: | If Closures are placed in constant expressions they are subject to the following constraints: | ||
- | * They must not include variables from the surrounding scope using < | + | * They may not include variables from the surrounding scope using < |
- | * They must be < | + | * They must be < |
+ | |||
+ | Both of these constraints will be verified at compile time. | ||
==== Scoping ==== | ==== Scoping ==== | ||
Line 64: | Line 92: | ||
</ | </ | ||
- | Passing a Closure to a new expression: | + | Passing a Closure to a <php>new</ |
<PHP> | <PHP> | ||
Line 79: | Line 107: | ||
</ | </ | ||
- | ==== Use Cases ==== | + | ===== Use Cases ===== |
Custom field validation for an attribute-based object validation library: | Custom field validation for an attribute-based object validation library: | ||
Line 105: | Line 133: | ||
} | } | ||
})] | })] | ||
- | public function testSubtraction(int $minuend, | + | public function testSubtraction(int $minuend, |
{ | { | ||
\assert(Calculator:: | \assert(Calculator:: | ||
Line 112: | Line 140: | ||
</ | </ | ||
+ | Custom formatting for an attribute-based serialization library: | ||
+ | |||
+ | <PHP> | ||
+ | final class LogEntry | ||
+ | { | ||
+ | | ||
+ | |||
+ | # | ||
+ | | ||
+ | })] | ||
+ | | ||
+ | } | ||
+ | </ | ||
===== Backward Incompatible Changes ===== | ===== Backward Incompatible Changes ===== | ||
Line 157: | Line 198: | ||
* Support non-static Closures. | * Support non-static Closures. | ||
* Support first-class callables. | * Support first-class callables. | ||
+ | * Support variable capturing if/when variables may appear in constant expressions. | ||
===== Proposed Voting Choices ===== | ===== Proposed Voting Choices ===== | ||
- | <doodle title=" | + | <doodle title=" |
* Yes | * Yes | ||
* No | * No |
rfc/closures_in_const_expr.1729851060.txt.gz · Last modified: 2024/10/25 10:11 by timwolla