On Sat, Jun 29, 2019 at 9:07 AM CHU Zhaowei <[email protected]> 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 <[email protected]>
> > Sent: Saturday, June 29, 2019 6:52 AM
> > To: Benjamin Morel <[email protected]>
> > Cc: PHP Internals <[email protected]>
> > 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
> > [email protected]
> >
> > --
> > 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
>
>