Re: [VOTE] Make compact function reports undefined passed variables
| From: | Marco Pivetta | Date: | Sun, 10 Jun 2018 18:50:38 +0000 |
| Subject: | Re: [VOTE] Make compact function reports undefined passed variables | ||
| References: | 1 2 3 4 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-102217@lists.php.net to get a copy of this message | ||
The existence of anything that internally relies on
get_defined_vars() is
a blocker for applying further optimisations to the engine (think stack
frames), which is probably why Dmitry suggested its removal.
On Sun, 10 Jun 2018, 20:42 Hoffman, Zachary Robert, <zrhoffman@ku.edu>
wrote:
> >>
> >> Hi Gabriel,
> >>
> >>> compact(), extract(), parse_str() (with 1 argument) and
> >>> get_defined_vars() are bad functions, because they access local
> variables
> >>> indirectly.
> >>>
> >>> They might be considered to be removed in the next major PHP version,
> >>> despite of this fix.
> >>>
> >>>
> >>> Thanks. Dmitry.
> >>>
> >>>
> >>
> >> Hello Dmitry.
> >>
> >> Thanks for this feedback. When I decided to create this RFC adding a
> >> warning, many of friends actually suggested me creating an RFC
> depracting
> >> compact, and complaing with the same arguments as
> >> yours.
> >>
> >> Do you think we should do this already in PHP 7.3?
> >>
> >> Thanks.
> >>
> >--
> >Gabriel Caruso
>
> Deprecating compact() would hurt workflows where you use the same variable
> names
> several times in different contexts, even though they are only declared
> locally
> for the purposes of compact() itself.
>
> Below is an example of what I mean. The array used for compact() is the
> same one
> that is iterated over outside of class A. Further, we use the variables
> that are
> compacted earlier in A::c(), so it is convenient to use them as local
> variables.
>
> class A
> {
> private static $b = [
> 'a',
> 'b',
> 'c',
> 'd',
> ];
>
> public static function b()
> {
> return self::$b;
> }
>
> public function d()
> {
> return 2;
> }
>
> public function c()
> {
> $d = $this->d();
> $a = pow($d, $d + 1);
> $c = $a ^ 0b1100;
> $b = $a - $d;
>
> return new B(
> compact(
> $this->b()
> )
> );
> }
> }
>
> class B
> {
> private $a;
>
> public function __construct($a)
> {
> $this->a = $a;
> }
>
> public function a(string $name)
> {
> return $this->a[$name];
> }
> }
>
> $a = (new A())->c();
>
> foreach (A::b() as $b) {
> echo $a->a($b) . PHP_EOL;
> }
>
> The alternative would be manipulating array elements directly, like this:
>
> public function c()
> {
> $e['d'] = $this->d();
> $e['a'] = pow($e['d'], $e['d'] + 1);
> $e['c'] = $e['a'] ^ 0b1100;
> $e['b'] = $e['a'] - $e['d'];
>
> return new B($e);
> }
>
> That is far more cumbersome. So, compact() has legitimate uses sometimes.
>
> Cheers,
>
> --
> Zach Hoffman
> ________________________________________
> From: Gabriel Caruso <carusogabriel34@gmail.com>
> Sent: Saturday, June 9, 2018 12:25
> To: Dmitry Stogov
> Cc: PHP Internals
> Subject: Re: [PHP-DEV] [VOTE] Make compact function reports undefined
> passed variables
>
> >
> > Hi Gabriel,
> >
> >> compact(), extract(), parse_str() (with 1 argument) and
> >> get_defined_vars() are bad functions, because they access local
> variables
> >> indirectly.
> >>
> >> They might be considered to be removed in the next major PHP version,
> >> despite of this fix.
> >>
> >>
> >> Thanks. Dmitry.
> >>
> >>
> >
> > Hello Dmitry.
> >
> > Thanks for this feedback. When I decided to create this RFC adding a
> > warning, many of friends actually suggested me creating an RFC depracting
> > compact, and complaing with the same arguments as yours.
> >
> > Do you think we should do this already in PHP 7.3?
> >
> > Thanks.
> >
> --
> Gabriel Caruso
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
>
>