Re: PHP 5 Strings are References?!
| From: | Jochem Maas | Date: | Wed, 30 Mar 2005 13:48:16 +0000 |
| Subject: | Re: PHP 5 Strings are References?! | ||
| References: | 1 2 3 4 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-211869@lists.php.net to get a copy of this message | ||
Chris wrote:
Richard Lynch wrote:...On Tue, March 29, 2005 7:58 pm, Chris said:Richard Lynch wrote:
I tested Richards reproduce script on php 5.0.3 on a Debian machine with the following ini settings: register_globals = Off register_long_arrays = Off register_argc_argv = Off magic_quotes_gpc = Off magic_quotes_runtime = Off (i.e. all relevant ini settings are php5 defaults) and I get the same freakin' references from/in the SESSION array.Are you sure you don't have register_globals enabled?
I agree with Chris that register_globals can only cause more pain and misery :-/ but in this case the problem exists regardless of register_globals setting. here is a func I sometimes use when going to war with a register_globals=On server :-) nothing special and I blagged the idea from somewhere/someone (probably in the user comments somewhere in the php manual :-/) function unRegisterGlobals() {Actually, they *ARE* enabled by my webhost. I don't really think that's relevant, however, as PHP is storing $name back *IN* to my $_SESSION data, just because I did: $name = $_SESSION['name']; $name = "Fooey"; $name is a STRING. It's not an object. It should *NOT* be a Reference! But it is a Reference, so changing $name alters $_SESSION['name']Sorry, meant to reply to list, not just you. All I'm saying is that Sessions act extremely oddly with register_globals enabled. With register_globals on I believe the global variable, acts as a reference. It's not because it's a string, it's because it's a session variable, and it needs to keep track of changes to the variable.
if (ini_get('register_globals')) {
$SGs = array($_SERVER, $_ENV, $_FILES, $_COOKIE, $_POST, $_GET);
if (isset($_SESSION)) { array_unshift($SGs, $_SESSION); }
// SG == super global
foreach ($SGs as $sg) {
foreach ($sg as $k => $v) { unset($GLOBALS[ $k ]); }
}
ini_set('register_globals', false);
}
}