On Sun, Aug 25, 2024, at 15:35, Larry Garfield wrote: > On Sat, Aug 24, 2024, at 11:49 AM, Bilge wrote: > > Hi gang, > > > > New RFC just dropped: https://wiki.php.net/rfc/default_expression. I > > think some of you might enjoy this one. Hit me with any feedback. > > > > This one already comes complete with working implementation that I've > > been cooking for a little while. Considering I don't know C or PHP > > internals, one might think implementing this feature would be > > prohibitively difficult, but considering the amount of help and guidance > > I received from Ilija, Bob and others, it would be truer to say it would > > have been more difficult to fail! Huge thanks to them. > > > > Cheers, > > Bilge > > I am still not fully sold on this, but I like it a lot better than the > previous attempt at a default keyword. It's good that you mention named > arguments, as those do replace like 95% of the use cases for "put default > here" in potential function calls, and the ones it doesn't, you call out > explicitly as the justification for this RFC. > > The approach here seems reasonable overall. The mental model I have from the > RFC is "yoink the default value out of the function, drop it into this > expression embedded in the function call, and let the chips fall where they > may." Is that about accurate? > > My main holdup is the need. I... can't recall ever having a situation where > this is something I needed. Some of the examples show valid use cases (eg, > the "default plus this binary flag" example), but again, I've never actually > run into that myself in practice.
Potentially the most useful place would be in attributes. Take crell\serde (:p) for instance: #[SequenceField(implodeOn: default . ' ', joinOn: ' ' . default . ' ')] Where you may just want it to be a little more readable, but aren't interested in the default implosion. In attributes, it has to be a static expression and I think this passes that test? At least that is one place I would find most useful. Then there are things like the example I gave before, where you need to call some library code as library code and pass through the intentions. It also gets us one step closer to something like these shenanigans: function configureSerializer(Serde $serializer = new SerdeCommon(formatters: default as $formatters)); Where we can call configureSerializer(formatters: new JsonStreamFormatter()). Some pretty interesting stuff. > > My other concern is the list of supported expression types. I understand how > the implementation would naturally make all of those syntactically valid, but > it seems many of them, if not most, are semantically nonsensical. Eg, > `default > 1` would take a presumably numeric default value and output a > boolean, which should really never be type compatible with the function being > called. (A param type of int|bool is a code smell at best, and a fatal > waiting to happen at worst.) In practice, I think a majority of those > expressions would be logically nonsensical, so I wonder if it would be better > to only allow a few reasonable ones and block the others, to keep people from > thinking nonsensical code would do something useful. I'm reasonably certain you can write nonsensical PHP without this feature. I don't think we should be the nanny of developers. — Rob