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