Re: An BC issue in unserialize
| From: | Marco Pivetta | Date: | Thu, 17 Jul 2014 08:22:42 +0000 |
| Subject: | Re: An BC issue in unserialize | ||
| References: | 1 2 3 4 5 6 7 8 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-75660@lists.php.net to get a copy of this message | ||
On Thu, Jul 17, 2014 at 9:58 AM, Stas Malyshev <smalyshev@sugarcrm.com>
wrote:
> Hi!
>
> > As discussed in previous threads about this failure, we (doctrine) can
> > move away from the
unserialize() hack if
> > ReflectionClass#newInstanceWithoutConstructor() provides
> > support for
> > internal classes.
>
> Could you explain why it is needed to instantiate internal classes
> without calling the ctor? I'd like to understand the use case more.
>
I honestly don't have a use-case for it myself, and I also strongly
disagree with extending internal PHP classes due to their fragility.
What I know is that many Doctrine users extend ArrayObject in entities,
which is what caused us to apply a hotfix only for 5.4.29 and 5.5.13, and
NOT 5.6.0.
> > It doesn't need to cover ALL internal classes, just the most commonly
> > extended ones.
>
> The problem is we do not know which of these classes may fail if
> instantiated without initializing. With PHP classes, it's easy since the
> engine takes care of the basic plumbing. With C classes, if you don't
> call the function, you get nulls or worse, garbage, in places where
> values are expected.
Yes, that indeed.
What I am suggesting is to provide a small map of internal PHP classes that
are supported by ReflectionClass#newInstanceWithoutConstructor(), so that
their internal data can be initialized even if the userland constructor is
not invoked.
Marco Pivetta
http://twitter.com/Ocramius
http://ocramius.github.com/