rfc:first_class_callable_syntax
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:first_class_callable_syntax [2021/05/20 11:16] – nikic | rfc:first_class_callable_syntax [2021/06/29 08:29] – nikic | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== PHP RFC: First-class callable syntax ====== | ====== PHP RFC: First-class callable syntax ====== | ||
* Date: 2021-05-20 | * Date: 2021-05-20 | ||
- | * Author: Nikita Popov < | + | * Author: Nikita Popov <nikic@php.net>, |
- | * Status: | + | * Status: |
* Target Version: PHP 8.1 | * Target Version: PHP 8.1 | ||
* Implementation: | * Implementation: | ||
Line 22: | Line 22: | ||
In this example, each pair of expressions is equivalent. The '' | In this example, each pair of expressions is equivalent. The '' | ||
+ | |||
+ | The '' | ||
+ | |||
+ | <PHP> | ||
+ | $fn = Foo:: | ||
+ | // Think of it as: | ||
+ | $fn = fn(...$args) => Foo:: | ||
+ | </ | ||
===== Proposal ===== | ===== Proposal ===== | ||
Line 79: | Line 87: | ||
and acquire a callable to that trampoline instead. While certainly possible, this takes a step backwards from the straightforward semantics of the '' | and acquire a callable to that trampoline instead. While certainly possible, this takes a step backwards from the straightforward semantics of the '' | ||
+ | |||
+ | ==== Nullsafe calls ==== | ||
+ | |||
+ | The first-class callable syntax cannot be combined with the nullsafe operator. Both of the following result in a compile-time error: | ||
+ | |||
+ | <PHP> | ||
+ | $obj? | ||
+ | $obj? | ||
+ | </ | ||
+ | |||
+ | The '' | ||
+ | |||
+ | <PHP> | ||
+ | $fn = $obj? | ||
+ | // could be | ||
+ | $fn = $obj !== null ? $obj-> | ||
+ | // or | ||
+ | $fn = fn(...$args) => $obj? | ||
+ | </ | ||
+ | |||
+ | If this syntax were supported, it would likely follow the first interpretation, | ||
+ | |||
+ | ==== Strict types ==== | ||
+ | |||
+ | The first-class callable syntax interacts with '' | ||
===== Rationale ===== | ===== Rationale ===== | ||
Line 136: | Line 169: | ||
// What does this mean? | // What does this mean? | ||
- | $this-> | + | $this-> |
+ | </ | ||
+ | |||
+ | This can be resolved by limiting the '':: | ||
+ | |||
+ | A problem with the '' | ||
+ | |||
+ | Here are some commonly suggested syntax choices for first-class callables that are definitely **not** possible due to ambiguities: | ||
+ | |||
+ | < | ||
+ | // Using "&" | ||
+ | & | ||
+ | // Is ambiguous with by-reference assignment: | ||
+ | |||
+ | $x = & | ||
+ | // is currently interpreted as | ||
+ | $x =& $foo-> | ||
+ | |||
+ | // Using no sigil: | ||
+ | strlen; // Is ambiguous with constant strlen | ||
+ | Foo::bar; // Is ambiguous with class constant Foo::bar | ||
+ | $foo-> | ||
+ | </ | ||
+ | |||
+ | Here are syntax choices that are (mostly) unambiguous if only usage with proper symbols is allowed: | ||
+ | |||
+ | < | ||
+ | // As mentioned above, people might expect this to return " | ||
+ | strlen:: | ||
+ | // Same as previous, and we'd rather avoid the legacy " | ||
+ | strlen:: | ||
+ | |||
+ | // Unlike the "&" | ||
+ | *strlen; | ||
+ | // This also applies to various other sigils that are not yet used in unary position, but are equally meaningless: | ||
+ | ^strlen; | ||
</ | </ | ||
- | I am generally open to using a different syntax | + | I am generally open to using a different syntax, as I don't think forward-compatibility with a potential PFA feature is critical, but none of the choices are particularly great. |
===== Backward Incompatible Changes ===== | ===== Backward Incompatible Changes ===== |
rfc/first_class_callable_syntax.txt · Last modified: 2021/07/16 09:55 by nikic