Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:46526 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 25565 invoked from network); 27 Dec 2009 14:11:48 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 27 Dec 2009 14:11:48 -0000 X-Host-Fingerprint: 76.233.72.111 unknown Received: from [76.233.72.111] ([76.233.72.111:15099] helo=localhost.localdomain) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 1B/86-26502-42B673B4 for ; Sun, 27 Dec 2009 09:11:48 -0500 Message-ID: <1B.86.26502.42B673B4@pb1.pair.com> To: internals@lists.php.net Date: Sun, 27 Dec 2009 09:11:44 -0500 User-Agent: Thunderbird 2.0.0.23 (X11/20090817) MIME-Version: 1.0 References: <31.35.26502.C79573B4@pb1.pair.com> In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Posted-By: 76.233.72.111 Subject: Re: [PHP-DEV] Unsetting loop variables at the end of the loop From: mwacker@cornellsun.com (Mike Wacker) Adam Harvey wrote: > 2009/12/27 Mike Wacker : >> PHP's documentation for foreach states that if you iterate by reference >> [foreach ($ii as &$i) ...], you should unset $i after the loop. $i still >> points to the last element of the array - updating $i or reusing it will >> update the last element of the array. >> >> In short, why doesn't PHP automatically unset $i after the loop? I can't >> think of too many cases where you would want to hold on to that reference >> after you exit the loop, but I can think of a lot of scenarios where a user >> could accidentally tamper the array by using $i in a different context later >> on (especially since loop variable names often are reused). > > This is a bit of a FAQ, frankly. May I suggest reading this thread > from a couple of months ago: > http://marc.info/?l=php-internals&m=125617546815934&w=2. There are > some more discussions both on the list and in the bug tracker if you > want to have a bit more of a dig into this. Ah, so it seems that "reference" was the keyword I was missing in my search queries for the bug database. It looks like I may have (re)opened a can of worms. > The really, really short version is that it would break backward > compatibility to change it now, I would agree that if this did change, it would have to change in PHP 6 and not 5.2/3. > it's useful in some (admittedly limited) cases, The main problem I see is that, like you said, these cases are limited. If you really need to hold on to a reference after the loop, then why not make an explicit reference? foreach ($ii as &$i) { $j =$ $i; // loop body } // PHP implicitly unset()'s $i In both this case and the status quo, someone has to add an extra line of code for every loop. Since re-using a loop variable is a much more common use case, I feel that PHP should accommodate that use case and force people using references outside the loop to add the line of code instead. > and it's not as though it's not well documented as behaving that way. > > Adam True, but it may not hurt to make the documentation more explicit to catch the most common use case. You could add this clause: ", especially if $value is used elsewhere as a loop variable again." (Though should I maybe move this part into the doc newsgroup?)