rfc:nullsafe_operator
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
rfc:nullsafe_operator [2020/07/14 08:23] – Typo ilutov | rfc:nullsafe_operator [2020/07/31 08:55] (current) – Close vote ilutov | ||
---|---|---|---|
Line 3: | Line 3: | ||
* Date: 2020-06-02 | * Date: 2020-06-02 | ||
* Author: Ilija Tovilo, tovilo.ilija@gmail.com | * Author: Ilija Tovilo, tovilo.ilija@gmail.com | ||
- | * Status: | + | * Status: |
* Target Version: PHP 8.0 | * Target Version: PHP 8.0 | ||
* Implementation: | * Implementation: | ||
Line 10: | Line 10: | ||
===== Introduction ===== | ===== Introduction ===== | ||
- | This RFC proposes | + | This RFC proposes |
===== Proposal ===== | ===== Proposal ===== | ||
Line 76: | Line 76: | ||
* Nullsafe method call ('' | * Nullsafe method call ('' | ||
* Static method call ('' | * Static method call ('' | ||
- | * Assignment ('' | ||
- | * Post/pre increment ('' | ||
The following elements will cause new sub-chains. | The following elements will cause new sub-chains. | ||
- | * Right hand side of an assignment | ||
* Arguments in a function call | * Arguments in a function call | ||
* The expression in '' | * The expression in '' | ||
Line 103: | Line 100: | ||
// | // | ||
// If $c is null chain 2 is aborted, method d() isn't called, null is passed to `$a-> | // If $c is null chain 2 is aborted, method d() isn't called, null is passed to `$a-> | ||
- | |||
- | | ||
- | // -------------------- chain 1 | ||
- | // ------- chain 2 | ||
- | // If $foo is null chain 1 is aborted, `$a-> | ||
- | |||
- | | ||
- | // ------------ chain 1 | ||
- | // If $foo is null, chain 1 is aborted, ++ is skipped | ||
</ | </ | ||
==== Rationale ==== | ==== Rationale ==== | ||
Line 121: | Line 109: | ||
$foo? | $foo? | ||
</ | </ | ||
- | The evaluation of '' | + | The evaluation of '' |
**2. You can see which methods/ | **2. You can see which methods/ | ||
Line 131: | Line 119: | ||
Without short circuiting every subsequent method call and property access in the chain will require using the nullsafe operator or you will get a “Call to a member function on null” error. With short circuiting this isn’t necessary which makes it more obvious which methods/ | Without short circuiting every subsequent method call and property access in the chain will require using the nullsafe operator or you will get a “Call to a member function on null” error. With short circuiting this isn’t necessary which makes it more obvious which methods/ | ||
- | **3. Allows for nullsafe operator in write context** | + | **3. Mixing with other operators** |
- | + | ||
- | <code php> | + | |
- | $foo = null; | + | |
- | $foo? | + | |
- | var_dump($foo); | + | |
- | + | ||
- | // Without short circuiting: | + | |
- | // Fatal error: Can't use nullsafe result value in write context | + | |
- | + | ||
- | // With short circuiting: | + | |
- | // NULL | + | |
- | </ | + | |
- | Without short circuiting the assignment to a nullsafe property would be illegal because it produces an r-value (a value that cannot be assigned to). With short circuiting if a nullsafe operation on the left hand side of the assignment fails the assignment is simply skipped. | + | |
- | + | ||
- | **4. Mixing with other operators** | + | |
<code php> | <code php> | ||
Line 189: | Line 162: | ||
===== Syntax choice ===== | ===== Syntax choice ===== | ||
- | The '' | + | The '' |
+ | |||
+ | ===== Forbidden usages ===== | ||
+ | |||
+ | ==== Nullsafe operator in write context ==== | ||
+ | |||
+ | Using the nullsafe operator in write context ist not allowed. | ||
+ | |||
+ | <code php> | ||
+ | $foo? | ||
+ | // Can't use nullsafe operator in write context | ||
+ | |||
+ | foreach ([1, 2, 3] as $foo? | ||
+ | // Can't use nullsafe operator in write context | ||
+ | |||
+ | unset($foo? | ||
+ | // Can't use nullsafe operator in write context | ||
+ | |||
+ | [$foo? | ||
+ | // Assignments can only happen to writable values | ||
+ | </ | ||
+ | It was previously suggested to allow the nullsafe operator in the left hand side of assignments and skip the assignment if the left hand side of the nullsafe operator was '' | ||
- | ===== References | + | ==== References ==== |
Taking the reference of a nullsafe chain is not allowed. This is because references require l-values (memory locations, like variables or properties) but the nullsafe operator can sometimes return the r-value '' | Taking the reference of a nullsafe chain is not allowed. This is because references require l-values (memory locations, like variables or properties) but the nullsafe operator can sometimes return the r-value '' | ||
<code php> | <code php> | ||
- | $x = & | + | $x = &$foo?->bar; |
// Could loosely be translated to | // Could loosely be translated to | ||
Line 211: | Line 205: | ||
<code php> | <code php> | ||
// 1 | // 1 | ||
- | $x = & | + | $x = &$foo?->bar; |
// Compiler error: Cannot take reference of a nullsafe chain | // Compiler error: Cannot take reference of a nullsafe chain | ||
Line 238: | Line 232: | ||
===== Vote ===== | ===== Vote ===== | ||
- | Voting starts 2020-07-14 and ends 2020-07-28. | + | Voting starts 2020-07-17 and ends 2020-07-31. |
<doodle title=" | <doodle title=" |
rfc/nullsafe_operator.1594715012.txt.gz · Last modified: 2020/07/14 08:23 by ilutov