php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Doc Bug #16687 Constants not being interpreted in "variable variables"
Submitted: 2002-04-18 16:43 UTC Modified: 2002-11-15 04:11 UTC
Votes:1
Avg. Score:5.0 ± 0.0
Reproduced:0 of 0 (0.0%)
From: lux at simian dot ca Assigned:
Status: Closed Package: Documentation problem
PHP Version: 4.2.0 OS: Red Hat Linux 7.1
Private report: No CVE-ID: None
 [2002-04-18 16:43 UTC] lux at simian dot ca
Constants do not appear to be interpreted properly in the following context:

${CONSTANT}

I found this problem with the following code:

<?php

if (PHP_VERSION < '4.1.0') {
  define ('_GET', 'HTTP_GET_VARS');
  // etc.
} else {
  define ('_GET', '_GET');
  // etc.
}

print_r (${_GET});

?>

This should print out the $_GET hash in 4.2.0RC4, but it prints nothing.  A quick check of the _GET constant shows that it does contain the proper value.

I compile php with:

'./configure' '--with-pgsql=shared' '--with-gd' '--with-mysql=/usr/local/mysql' '--with-apxs2=/usr/local/apache2/bin/apxs' '--enable-shmop' '--enable-xslt' '--with-xslt-sablot'

Thanks!

Patches

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2002-04-18 17:30 UTC] lux at simian dot ca
It seems to be happening only under certain contexts.  Here is a script that works fine:

<?php

$test = 'asdf';

define ('_TEST', 'test');

echo 'constant: ';
print_r (${_TEST});

echo '<br />direct: ';
print_r ($test);

?>

And here is code that does not:

<?php

if (PHP_VERSION < '4.1.0') {
	define ('_GET', 'HTTP_GET_VARS');
} else {
	define ('_GET', '_GET');
}

class CGI {
	var $param = array ();

	function CGI () {
		global $HTTP_GET_VARS, $HTTP_POST_VARS, $HTTP_POST_FILES;

		if (${_GET}) {
			reset (${_GET});
			while (list ($k, $v) = each (${_GET})) {
				if (get_magic_quotes_gpc () == 1) {
					$this->{$k} = stripslashes ($v);
				} else {
					$this->{$k} = $v;
				}
				array_push ($this->param, $k);
			}
		} else {
			echo '<br />_GET value: '; print_r (_GET);
			echo '<br />$_GET value: '; print_r ($_GET);
			echo '<br />${_GET} value: '; print_r (${_GET});
		}
	}
}

$cgi = new CGI;

echo '<br />$cgi value: '; print_r ($cgi);

?>
 [2002-04-18 19:09 UTC] sniper@php.net
reclassified
 [2002-04-19 10:33 UTC] derick@php.net
You can't use superglobals indirectly, check this:

$t = "_GET";
var_dump ($$t);

doesn't work neither, and it wasn't supposed to work.

However, this does work (because $HTTP_GET_VARS is not a superglobal):

$t = "HTTP_GET_VARS";
var_dump ($$t);


Derick
 [2002-04-19 11:11 UTC] lux at simian dot ca
But then why does it work under certain circumstances and not others?  Regardless whether intended or not, this is inconsistent behaviour.

I also think that having these differences between regular variables and the "superglobals" shouldn't be necessary.  If I can't use them in the same contexts as regular variables, then I would personally prefer the $HTTP_*_VARS instead, because you can.

I have found my approach to abstracting this difference ($HTTP_*_VARS vs. $_*) between PHP versions to be really beneficial to my scripts.  I can abstract them both down to one name, and use a single reference to the appropriate one instead of sticking if statements every time I need to know which one to use.

Sorry to keep buggin' ya, but I think this may be a fair enough argument for change.
 [2002-04-19 12:40 UTC] mfischer@php.net
True true. Derick (or someone else) mind briefly explaining why this is/has to be different?
 [2002-04-19 14:53 UTC] mfischer@php.net
Reclassified.

It should be documented that due the special way super globals are treated the cannot be used with variable variables.
 [2002-04-19 15:17 UTC] goba@php.net
I have already reported this problem, but nothing happened.
Superglobals seemed to be accessible with variable variables in the global scope, but not in any local scope (inside a function). Derick told me, that it is by design, but IMHO this is incosistent, and quite ugly :((

--
Goba
 [2002-04-19 21:01 UTC] mfischer@php.net
By design ? hehe

Ok, I *think* it was not 'by design', I think this just turned out to be the way it is after it has been implemented.  I don't think while writing the code and was kept in mind 'no, we do not want them not to be accessible in functions with variable variables'.

Ok, so much. Versions of PHP has already been released, so we should document it.

Btw, goba, using the search on php.net I couldn't find a single page refering to the super globals ... ? (I haven't yet browser through the manual index as I tend to find that annyoing)
 [2002-04-20 04:07 UTC] goba@php.net
Superglobals are named autoglobals or "auto global"s in many cases. Because you need not use "global" to make it global... I personaly think that superglobal is a better name for them (as used by Rasmus first AFAIK), so I use this name.

--
Goba
 [2002-11-15 04:11 UTC] philip@php.net
The feature of inability to use autoglobals / superglobals as variable variables is now documented in two places.  The variable variables page and the superglobals page.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Mon Aug 19 19:01:28 2024 UTC