Hello list,
I don't know if something like this was already proposed in the past,
I did not find anything.

Sometimes it would be nice to have a code block inside an expression, like this:

public function f(string $key) {
    return $this->cache[$key] ??= {
        // Calculate a value for $key.
        [...]
        return $value;
    }
}

Currently, to achieve the same, we have two options which both add
overhead both in code verbosity and in performance:
1. Call another method or closure after the ??=.
2. Use if (isset(...)) instead of the ??= shortcut. This results in
repetition of other parts of the expression, because the if/else
cannot be inside the expression.

E.g. this is option 1 with a closure:

public function f(string $key) {
    return $this->cache[$key] ??= (function () use ($key) {
        // Calculate a value for $key.
        [...]
        return $value;
    })();
}

Option 1 with a real method would look like this:

public function f(string $key) {
    return $this->cache[$key] ??= $this->calc($key);
}
private function calc(string $key) {
    // Calculate a value for $key.
    [...]
    return $value;
}


The `{}` syntax seems like the most obvious choice at first, but I
think it would not work.

Statement groups with curly brackets are already possible right now,
see https://www.php.net/manual/en/control-structures.intro.php, but
they are not really useful for anything: They cannot be used as
expressions, they don't have their own return value, and they don't
isolate their variables.

Another option would be a special keyword before the curly block.
We could introduce a new keyword like `expr`, or use an existing one like `fn`.

$x = 4 + fn {return 3;};
// or
$x = 4 + expr {return 3;}

The compiler/interpreter could either convert the block into a
closure, or treat it as a new language feature, which might bring
performance benefits.


Any thoughts?
-- Andreas

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php

Reply via email to