On Thursday, 14 November 2024 at 17:24, Larry Garfield <la...@garfieldtech.com> wrote:
> On Thu, Nov 14, 2024, at 7:37 AM, Christian Schneider wrote: > > > Am 14.11.2024 um 10:59 schrieb Marco Pivetta ocram...@gmail.com: > > > > > On Thu, 14 Nov 2024, 11:29 MrMeshok, ilyaorlov...@gmail.com wrote: > > > > > > > Hello, Internals! > > > > > > > > As you know if you try to unpack a regular object (`...$object`) you > > > > will get an error: Only arrays and Traversables can be unpacked. > > > > I don't really see a reason for this restriction, because foreach on > > > > objects works perfectly fine, so I made a feature request on GitHub to > > > > change this behavior (https://github.com/php/php-src/issues/16038) and > > > > was advised to see opinions on this here. > > > > So, what do you think? And does this change require RFC? > > > > > > TBH, foreach on objects is already quite an abomination in itself 😬 > > > > It is a bit less weird if you use value objects or json data in object form. > > I would be careful to judge how other people use the language, just saying > > ;-) > > > > - Chris > > > Judging how one should use a language is a core component of language design. > > I'm with Marco on this one, and I'd be more than happy to get rid of > foreach($object), too. It's way, way more complicated a topic than you think. > > How does visibility play into it? > Should hooks be invoked or no? > Do references play into anything? > > Those are some of the questions we had to deal with for hooks and foreach(). > It's non-trivial. You'd need to address all the same edgy issues here, too. > > And that's assuming it's even a good idea, which I don't think it is. If you > are using a value object to define unordered arguments, just pass the value > object itself. If the receiving function can't handle that, then it is simple > enough that you don't need a value object. If that's not the case, then your > code design is bad and the language should not try to paper over that for > you. Either simplify the function or adapt it to use a value object directly. > (With union types you can even do so in a BC fashion much of the time.) Agreed, this bites us constantly when needing to reason about what an "object" is in PHP. Similar to array it mixes the concept of a struct, with that of a reference value, and "overloading" various behaviours (e.g. iterators and ArrayAccess). It is *extremely* simple to go from foreach ($object as $prop) {} to forearch(get_object_vars($object) as $prop) {} and mandating this would resolve a lot of complexity, be that from the perspective of what is "possible" or not to do, and from an engine PoV. Best regards, Gina P. Banyard