Re: [RFC] Deprecate the extract function in PHP 7.3
| From: | Ryan Pallas | Date: | Fri, 15 Sep 2017 17:30:44 +0000 |
| Subject: | Re: [RFC] Deprecate the extract function in PHP 7.3 | ||
| References: | 1 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-100639@lists.php.net to get a copy of this message | ||
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