Re: Variable scopes for language constructs (foreach, ...)
| From: | Martin Scotta | Date: | Thu, 23 Jun 2011 15:18:59 +0000 |
| Subject: | Re: Variable scopes for language constructs (foreach, ...) | ||
| References: | 1 2 3 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-53538@lists.php.net to get a copy of this message | ||
Martin Scotta
On Thu, Jun 23, 2011 at 12:12 PM, Paul Dragoonis <dragoonis@gmail.com>wrote:
> On Thu, Jun 23, 2011 at 4:09 PM, Ferenc Kovacs <tyra3l@gmail.com> wrote:
>
> > On Thu, Jun 23, 2011 at 5:03 PM, Stefan Neufeind <neufeind@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.
> >
> >
> I would like to see, in a future version, the local var of the foreach()'s
> refcount being dropped to 0 or something similar. Unless it is a
> by-reference variable in which case it should remain untouched.
>
>
> > Tyrael
> >
>
Also I've love to be able to....
$var = 'global';
class Foo {
private $var = 'member';
function test1() {
return $var;
}
function test2($var='param') {
return $var;
}
function test3() {
$var = 'variable';
return $var;
}
function test4() {
global $var;
return $var;
}
}
$foo = new Foo();
var_dump( $foo->test1() ); // member
var_dump( $foo->test2() ); // param
var_dump( $foo->test3() ); // variable
var_dump( $foo->test4() ); // global
From a "language" POV this seems very possible.
Is it possible from a core POV ?
Do you think this need a RFC? I can write some