get_defined_vars()和parse_str如何工作?

时间:2013-08-27 17:17:38

标签: php

看看以下内容:

file1.php

$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
);*/

file2.php

$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. 如何才能拥有重复的数组索引? (参见file1的例子)。
  2. 为什么在第二个例子中,变量$1未定义,但确实显示在get_defined_vars()数组中?我如何访问它?
  3. 在示例1中,$1
  4. 未覆盖parse_str的来源

1 个答案:

答案 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来访问该非法变量名称。