Re: Disable autovivification on false

From: Date: Wed, 26 May 2021 10:54:21 +0000
Subject: Re: Disable autovivification on false
References: 1 2  Groups: php.internals 
Request: Send a blank email to internals+get-114611@lists.php.net to get a copy of this message
On Tue, May 25, 2021 at 10:27 PM Dusk <dusk@woofle.net> wrote: > On May 25, 2021, at 09:23, Kamil Tekiela <tekiela246@gmail.com> wrote: > > I'd like to start a discussion on the following RFC > > https://wiki.php.net/rfc/autovivification_false > > Particularly, I am looking for opinions on whether this behaviour should > be > > left alone, should be disabled on false, or should be disabled on null > and > > false, and left only for undefined variables. > > It seems to me there are two different sorts of autovivification which can > happen. (They may actually be the same thing under the hood, but they feel > different to me.) > > One is autovivification within an array, e.g. > > $x = ["b" => null, "c" => false]; > $x["a"][] = 1; // from unset > $x["b"][] = 2; // from null > $x["c"][] = 3; // from false > > The other is autovivification on values outside arrays, e.g. > > $b = null; $c = false; $d = new stdClass(); > $a[] = 1; // from unset > $b[] = 2; // from null > $c[] = 3; // from false > $obj->a[] = 4; // from unset on an object property, same idea > > (The same behavior occurs in each case if an explicit key is used instead > of [].) > > From my perspective, the latter is much more concerning than the former. > Adding dimensions to an existing array feels like less of a > type-correctness violation than calling an entire array into existence > where a non-array value (or no value at all) existed before. > I agree to that last point. I think the cases so far where I have relied on autovivification were all like: ``` function f(iterable $xs) { $map = []; // initialization foreach ($xs as $x) { // $map[foo($x)] ??= []; not needed // $map[foo($x)][bar($x)] ??= []; not needed $map[foo($x)][bar($x)][] = qux($x); // autovivification } // Then e.g.: foreach ($map as $foo => $submap) { foreach ($submap as $bar => $quxes) { /* ... */ } } } ``` All other cases I can remember were arguably bugs (missing initialization). That said, deprecating it on false would already be a +1. Regards, -- Guilliam Xavier

« previous php.internals (#114611) next »