看看以下内容:
$a = 1;
$$a = "one"; // $1 = one
var_dump( ${'1'} ); // string(3) "one"
$str = "1=_one&foo=bar";
parse_str($str);
var_dump( ${'1'}, $foo );
// string(3) "one"
// and not "_one", so apparently $1 is not overwritten by parse_str
print_r( get_defined_vars() );
/*
Array(
[a] => 1
[1] => one <----- index is 1
[str] => 1=_one&foo=bar
[1] => _one <----- index is 1, again ?!?
[foo] => bar
);*/
$str = "1=_one&foo=bar";
parse_str($str);
var_dump( ${'1'}, $foo ); // will give "undefined variable: 1" and string(3) "bar"
print_r( get_defined_vars() );
/* if you run this from the command line you may have more variables in here:
Array(
[a] => 1
[str] => 1=_one&foo=bar
[1] => _one <--- variable 1 is defined here
[foo] => bar
);*/
$1
未定义,但确实显示在get_defined_vars()
数组中?我如何访问它?$1
parse_str
的来源
醇>
答案 0 :(得分:1)
你所得到的与做以下事情没有任何不同:
<?php
$GLOBALS[1] = 'foo';
或
<?php
$foo = 1;
$$foo = 'one';
因为PHP的变量名空间在内部保存为关联数组,所以您可以在该全局命名空间中轻松创建数组键,这些数组键完全有效,但是是非法变量名。
您无法通过这些非法变量名访问这些值,因为它们实际上是语法错误。但作为数组条目,它们就像任何其他数组条目一样,所以
<?php
$GLOBALS['1'] = 'one';
$foo = 1;
echo $1; // syntax error
echo $$foo; // outputs warning: undefined variable 1
echo $GLOBALS[1]; // outputs 'one'
请注意变量变量$$foo
。虽然您可以ASSIGN到潜在的非法变量名称,但您不能使用var-vars来访问该非法变量名称。