On 18 April 2023 17:48:00 BST, "Tim Düsterhus" <t...@bastelstu.be> wrote: >I'd rather see only the fat-arrow being allowed. Unless I'm missing something, >braces with colon is not used anywhere else, whereas braces + '=>' is known >from match() and '=>' more generally is already used with array literals [1]. >Having two similar syntaxes for the same thing is not great when both are >commonly needed is not great. They need to be documented and learned by >developers.
I think it makes sense to have an unquoted form here, because the common case is that they are names which analysers can match statically to particular properties, not strings which will be analysed at runtime. There are plenty of places in the language where dynamic names are allowed, but we don't just use strings for the static case: ${'foo'} = 'bar'( constant('BAZ') )->{'quux'}(); More specifically, the "name: $value" syntax matches named parameters, and while you can use an array for that (via ... unpacking), we don't force users to do so. In fact, the Future Scope of that RFC considered the opposite: using the colon syntax in arrays, along with a shorthand for pulling the key name from the variable name: https://wiki.php.net/rfc/named_params#shorthand_syntax_for_matching_parameter_and_variable_name > If I wanted to put these ideas into a general framework, I think one way to > go about this would be as follows: > > - Consider identifier: $expr as a shorthand for "identifier" => $expr. > - Consider :$variable as a shorthand for variable: $variable and thus > "variable" => $variable. That would give us: $point = ['x' => $x, 'y' => $y, 'z' => $z]; $point = [x: $x, y: $y, z: $z]; $point = [:$x, :$y, :$z]; $point = new Point(...['x' => $x, 'y' => $y, 'z' => $z]); $point = new Point(x: $x, y: $y, z: $z); $point = new Point(:$x, :$y, :$z); $point = clone $point with {'x' => $x, 'y' => $y, 'z' => $z}; $point = clone $point with {x: $x, y: $y, z: $z}; $point = clone $point with {:$x, :$y, :$z}; Rather than making everything use an array or array-like syntax, I would probably go the other way and scrap the special syntax for dynamic names, making the whole thing look like a function call, with support for array unpacking: $point = clone $point with (x: $x, y: $y, z: $z); $point = clone $point with (...['x' => $x, 'y' => $y, 'z' => $z]); Regards, -- Rowan Tommins [IMSoP] -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: https://www.php.net/unsub.php