On Thu, Jun 23, 2011 at 5:03 PM, Stefan Neufeind <neufe...@php.net> wrote:
> Hi, > > I've lately discussed with a colleague which scopes of variables exist > for PHP or would probably make sense. In general I think the general > idea of having variables available all throughout a function is okay as > this allows things like > > foreach($vals as $v) { > // ... > $found = true; > } > if($found) { > // ... > } > > (setting $found inside the loop while still being able to access it > outside) > > But the interesting part is that $v is also still available outside the > loop (last value). While most people would say this is not a big > problem, it can become problematic when using references. > > foreach($vals as &$temp) { > // ... > } > // ... > $temp = 5; > (when you don't think about the reference anymore but want some > temp-variable) > > > If this has been "throughly discussed" before, please excuse. But if not > maybe somebody could share his oppinion on the following proposal. > > What if we (for example with PHP 5.4 or if not possible maybe with the > next one) change the behaviour so that > > * variables used for key/value in foreach (probably other places?) would > be limited to that loop-scope > > and maybe > * variable $found in the first example would need to be initialised > before the loop. Otherwise it would be a new variable inside the scope > of foreach that would be gone afterwards > > and/or maybe > * allowing to explicitly limit variable-scopes inside blocks, for > example by allowing var $found somewhere inside a function to allow > things like > > if($a) { > var $temp; > > $temp = 5; > } > // and $temp would be gone here; was limited to the scope in which it > was defined by var > > > Hope this is not too much of a non-sense idea to you :-) > > Hi, it was discussed many times on the list, and this behavior is also documented, see http://php.net/manual/en/control-structures.foreach.php "Reference of a $value and the last array element remain even after the foreach loop. It is recommended to destroy it by unset()." personally I find that weird, and unintuitive, but changin that in a major or minor version could be changed if we chose to. Tyrael