Re: [PHP-DEV] Unsetting loop variables at the end of the loop

2009-12-27 Thread Mike Wacker

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

2009-12-27 Thread 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?)




--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP-DEV] PHP6's future

2009-12-27 Thread Mike Wacker

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

2009-12-27 Thread 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).


--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php