Re: [RFC] Deprecate the extract function in PHP 7.3
| From: | ilija dot tovilo at me dot com | Date: | Fri, 15 Sep 2017 17:38:22 +0000 |
| Subject: | Re: [RFC] Deprecate the extract function in PHP 7.3 | ||
| References: | 1 2 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-100642@lists.php.net to get a copy of this message | ||
Hi Ryan
I can see your argument. The reasoning behind it is that a function in the standard library should
not encourage unsafe code. Admittedly, since this function is rarely used except for templating
systems one could call this a non-issue. I just wanted to bring it up.
Regards
On 15 Sep 2017, 19:30 +0200, Ryan Pallas <derokorian@gmail.com>, wrote:
>
>
> > On Sep 15, 2017 11:22 AM, <ilija.tovilo@me.com> wrote:
> > > Hi!
> > >
> > > The
extract function takes an associative array and
> > > puts it into the local symbol table.
> > > http://php.net/manual/en/function.extract.php
> > >
> > > ```
> > > $array = [
> > > ‘foo’ => ‘foo’,
> > > ‘bar’ => ‘bar’,
> > > ];
> > >
> > > extract($array);
> > >
> > > print $foo; // "foo"
> > > ```
> > >
> > > As a second parameter the extract function takes some
> > > options to make this function less dangerous, like EXTR_SKIP that
> > > prevents an existing local variable of being overwritten. There’s a few more options, go ahead and
> > > take a look at the documentation. EXTR_OVERWRITE is the default one
> > > though. You can also pass a prefix for the variable names as a third argument.
> > >
> > > I seriously doubt the usefulness of this function, especially looking at the
> > > potential risks. The fact that overwriting the local variables is the default behaviour doesn’t
> > > make it any better. I suggest deprecating it in PHP 7.3 and removing it in 8.
> > >
> > > In a whole Symfony-Stack (3.4) with all of it’s dependencies I could only find two
> > > usages of this function, both of which could be easily rewritten in vanilla PHP:
> > >
> > > https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Templating/PhpEngine.php#L148
> > >
> > > https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Templating/PhpEngine.php#L158
> > >
> > > Only downside: A polyfill is probably impossible since you cannot mutate the local
> > > symbol table of the callee (as far as I’m aware).
> > >
> > > Any thoughts?
>
> I see no gain by removing this function. I've also seen it used for templating quite
> often. Yes the functionality could be changed not to use extract and end up working the same to the
> consumer but why make people rewrite these things for no apparent gain (and likely a small
> performance hit)?
>
> > >
> > > Regards
> > >
> > >
>