Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:53533 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 58541 invoked from network); 23 Jun 2011 15:09:10 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 23 Jun 2011 15:09:10 -0000 Authentication-Results: pb1.pair.com header.from=tyra3l@gmail.com; sender-id=pass; domainkeys=bad Authentication-Results: pb1.pair.com smtp.mail=tyra3l@gmail.com; spf=pass; sender-id=pass Received-SPF: pass (pb1.pair.com: domain gmail.com designates 209.85.160.170 as permitted sender) DomainKey-Status: bad X-DomainKeys: Ecelerity dk_validate implementing draft-delany-domainkeys-base-01 X-PHP-List-Original-Sender: tyra3l@gmail.com X-Host-Fingerprint: 209.85.160.170 mail-gy0-f170.google.com Received: from [209.85.160.170] ([209.85.160.170:45561] helo=mail-gy0-f170.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 15/D0-53684-517530E4 for ; Thu, 23 Jun 2011 11:09:09 -0400 Received: by gye5 with SMTP id 5so899480gye.29 for ; Thu, 23 Jun 2011 08:09:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=z3Dj0KtvK65id/WpACBL2FClCtu8kM4O11A6bLdgnbE=; b=oF1G1xu/4kIOt1nQV6xPYuf8l46aordfcLwW6Psd5aSO8VPHS54yT+gKMUtS1K40E/ /PNdTyPDkqRWjusIPnYDCPmQAnNataatyThhQlbOnj4/5EdoKgm7uA/BuSAVQXjT1zuq DGoJfRdsnWdSmDE0xpVm+JJvLnj/J8XPuP7NI= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; b=ZCXVe8dE7pHP2T63/Y9CnqulVtFgyVK/dlZ26J+CdMf88Ct0yiipy0T7tpqoKe1ZfW 0w8j9LcdfRljXu70HZF8tPM/xVDTBmeAGIWxQLoRYR8ClY8P3xcMyhCmw10K2BT6pOFL md1JorZbwcb1VsJyY+PovqwgAmN4AVAye6jXc= MIME-Version: 1.0 Received: by 10.150.160.19 with SMTP id i19mr2348553ybe.338.1308841746759; Thu, 23 Jun 2011 08:09:06 -0700 (PDT) Received: by 10.147.99.3 with HTTP; Thu, 23 Jun 2011 08:09:06 -0700 (PDT) In-Reply-To: <4E0355AE.4080305@php.net> References: <4E0355AE.4080305@php.net> Date: Thu, 23 Jun 2011 17:09:06 +0200 Message-ID: To: Stefan Neufeind Cc: internals@lists.php.net Content-Type: multipart/alternative; boundary=000e0cd733f862015a04a66277cd Subject: Re: [PHP-DEV] Variable scopes for language constructs (foreach, ...) From: tyra3l@gmail.com (Ferenc Kovacs) --000e0cd733f862015a04a66277cd Content-Type: text/plain; charset=UTF-8 On Thu, Jun 23, 2011 at 5:03 PM, Stefan Neufeind 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 --000e0cd733f862015a04a66277cd--