Re: [PHP-DEV] Unsetting loop variables at the end of the loop
Rasmus Lerdorf wrote: We can't just randomly reset variables based on their scope in this one specific case. If we are going to "fix" this, it should be done by introducing a way to do proper local scope variables. Resetting a reference simply because it is convenient in this one case would be completely inconsistent. -Rasmus I have some thoughts on this for PHP 6, but here's something else that might be worth looking into. When you write [foreach ($ii as $i) ...], you usually expect that $i is not a reference variable (you would have used &$i otherwise). However, PHP allows this even if $i is already a reference variable (e.g.: it was used as such in a previous loop). Now look at this code: function f(&$x) { echo $x; } $x = 1; $args = array($x); call_user_func_array('f', $args); In PHP 5.3, this would trigger a warning and cause $x to be NULL inside of f because you mixed value and reference types in an improper way. This foreach() issue is essentially being caused by a similar evil mix of reference and value types. Perhaps [foreach ($ii as $i)] should trigger a warning if $i already exists as a reference variable. -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] Unsetting loop variables at the end of the loop
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?) -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] PHP6's future
Chris Stockton wrote: Hello, On Mon, Nov 16, 2009 at 6:13 PM, Kalle Sommer Nielsen wrote: But what is every ones input on the matter of attempting to boost PHP6's development? I'm willing to give my part in whatever I can to help getting up on the feet to get this ball rolling. I think that some more focus on PHP6 would be great! Though I am not sure if 5.2 could stop development (although perhaps a resource shift to 5.3/6, starving new 5.2 features/backports for 5.2 security/bug fixes only). I would hate to see PHP6 become P(erl)HP6 :p I have the same feeling on 5.2. While I'm very happy with PHP 5.3 (especially with the addition of closures), it takes a nontrivial amount of work to migrate a web app from PHP 5.2 to 5.3. The PHP 5.3 compatibility issue for the Drupal CMS (http://drupal.org/node/360605), for example, had over 200 comments, and it took about 9 months before a patch was committed to the current version of Drupal in September (see comment 158). That's not the only example, but it's a prominent one that comes to my mind. It makes sense to shift resources, but it's way too soon IMHO to stop doing security and bug fixes for 5.2. -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php
[PHP-DEV] Unsetting loop variables at the end of the loop
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). -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php