Re: Alias stdClass to DynamicObject?
| From: | Mike Schinkel | Date: | Wed, 08 Sep 2021 21:33:36 +0000 |
| Subject: | Re: Alias stdClass to DynamicObject? | ||
| References: | 1 2 3 4 5 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-116020@lists.php.net to get a copy of this message | ||
> On Sep 8, 2021, at 4:59 PM, Rowan Tommins <rowan.collins@gmail.com> wrote:
>> I assume we would also disallow dynamic properties in anonymous classes too, right? After
>> all, they are just statically declared classes that the developer do not assign a name.
>
> The difference I see is that stdClass/DynamicObject allows you to add or remove properties from
> an object *after it has been created*. I think a lot of use cases don't actually need that, and
> would benefit from error messages when doing so accidentally.
The concern is *not* were they are not needed, but instead where they *are* needed. Such as when
loading JSON from a source that does not ensure the schema is 100% stable over time.
That's also why I was hoping some of those complaining about deprecating stdClass would explain
explain their use-cases as they may know of use-cases we are not considering.
> You mentioned short-hand syntaxes like this:
>
>> $obj = {
>> foo: 1,
>> bar: "hello",
>> baz: true,
>> };
>
> I would love for that, or some other short-hand, to be equivalent to this:
>
> $obj = new class(foo: 1, bar: "hello", baz: true) {
> public $foo;
> public $bar;
> public $baz;
> public function __construct($foo, $bar, $baz) {
> $this->foo = $foo;
> $this->bar = $bar;
> $this->baz = $baz;
> }
> }
>
> That is, an anonymous class, with exactly those three properties. If you *also* want to be able
> to define extra properties after it's created, you could opt into that using whatever mechanism
> a named class would (parent class, trait, attribute, etc; see other thread).
Exactly!
Actually the same functionality for named classes is something I have wanted since literally the
very first day I starting using PHP so I wouldn't have to run userland code that loops through
an array that runs for so many object instantiations. I have to believe it would be more performant
if in C. (Reasons I do that? Loading from JSON, XML and/or SQL.). We've need either a magic
method or ability to pass a close for name translations and short circuiting.
That functionality is the primary reason I almost always use a base class; it would be nice to get
rid of that requirement.
> Similarly, the objects created by json_decode or PDO_FETCH_OBJECT only need the *initial*
> properties to be dynamic, not to allow properties to be added later.
How do you define "initial?"
-Mike