On Sat, Jun 29, 2019 at 9:07 AM CHU Zhaowei <m...@jhdxr.com> wrote: > I think we missed the point here. Clousre, or anonymous class, should not > be considered as normal class. We expect normal class existing once we > declare it till end of script. However, for anonymous class, it's usually > used within certain scope, so not only the instances, the class itself > should be included in the GC as well. > I guess the problem here is we didn't GC the space for definition of > anonymous classes. > > Regards, > CHU Zhaowei >
As Johannes already pointed out, we cannot garbage collect anonymous class definitions due to the existence of opaque references. A simple example of code that currently works: $obj = eval('return new class {}'); $class = get_class($obj); // create opaque reference unset($obj); // drop last direct reference $obj = new $class; In the end, an anonymous class is essentially a class with a random name and some inline construction sugar, but apart from that does not differ from ordinary classes. (I've also seen some calls to allow syntax like $class = class {}; that would make that even more obvious.) The situation here would be different if we had first-class classes and did not refer to classes by name. But as-is, I don't think garbage collecting anonymous classes is a possibility. Nikita > -----Original Message----- > > From: Stanislav Malyshev <smalys...@gmail.com> > > Sent: Saturday, June 29, 2019 6:52 AM > > To: Benjamin Morel <benjamin.mo...@gmail.com> > > Cc: PHP Internals <internals@lists.php.net> > > Subject: Re: [PHP-DEV] Memory leak in eval()'d code > > > > > > > > On 6/28/19 3:37 PM, Benjamin Morel wrote: > > > That's not a "leak". You create new objects (in this case, > classes), > > > they take memory. > > > > > > > > > Why do they not "leak" memory without eval() then? Replace with > > > `$object = new class {};` and memory usage stays flat. > > > There has do be some kind of garbage collection for these anonymous > classes. > > > > AFAIR this does not create new classes, since it's the same code, and > same code > > means same class. But eval() has new code every time, thus new class. > Generally > > I don't think PHP has any operation that can destroy an existing class. > It won't be > > easy too since you don't know whether there are any objects of this class > > around (unless you're in shutdown). > > > > -- > > Stas Malyshev > > smalys...@gmail.com > > > > -- > > PHP Internals - PHP Runtime Development Mailing List To unsubscribe, > visit: > > http://www.php.net/unsub.php > > > > > > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: http://www.php.net/unsub.php > >