On 06/23/2011 05:17 PM, Anthony Ferrara wrote:
> Personally, I don't care for the concept of a block scope.  I do
> understand that it can have benefits and make certain tasks easier.
> But it can also lead to weird bugs and inconsistencies.  For example,
> take the following code:
> 
> $good = false;
> 
> foreach ($array1 as $value) {
>     $good = $good & $value;
> }
> 
> unset($good);
> 
> foreach ($array2 as $value) {
>     $good = $value;
> }
> 
> var_dump($good);
> 
> What's the value of the dump?  Should it be null?  Should it be the
> last element of array2?  Why?

>From my feeling it would be the present outside of the first
foreach()-loop right before the unset() since the variable was created
outside the foreach() already. Then it was unset (doesn't exist) and
recreated inside the second foreach-loop.

If you even wanted to explicitly say that you don't want to go for the
outside-visibile $good then, as proposed, you could use some

var $good;

inside the foreach-loop imho to declare that you want a new variable
only visible inside the block. When that ends the outside-visibile $good
would be used again.

In case of "clean programming" the $good before the first example would
be there anyhow if somebody wants to rely on $good having a value after
the first foreach().

> We now have the ability to close around scopes, so I fail to see the
> reason to do this.  If you want a separate scope, then do an extract
> method on the loop.  Pull it out to another method and be done.  It'll
> be cleaner anyway.  Besides, if you buy the arguments made in most
> clean code books, you shouldn't have more than 1 block in a single
> function anyway (as then it starts to do too much).  So the scoping
> issue becomes pointless at that point.

You can always argue that creating smaller methods (like "no methods
with more than 100 lines" or so) would limit the problems of a forgotten
(not unset()) reference-variable. But imho that's not the point.


Kind regards,
 Stefan Neufeind

> On Thu, Jun 23, 2011 at 11:09 AM, Ferenc Kovacs <tyr...@gmail.com> wrote:
>> 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
>>
> 


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

Reply via email to