extract
extract
(PHP 4, PHP 5, PHP 7)
extract - 从数组中导入变量到当前符号表中
描述
int extract ( array &$array [, int $flags = EXTR_OVERWRITE [, string $prefix = NULL ]] )
将数组中的变量导入当前符号表中。
检查每个密钥以查看它是否具有有效的变量名称。它还检查与符号表中现有变量的冲突。
参数
array
一个关联数组。此函数将键作为变量名称和值作为变量值处理。对于每个键/值对,将创建在当前符号表中的变量,但须flags
和prefix
参数。
您必须使用关联数组; 数字索引的数组不会产生结果,除非您使用EXTR_PREFIX_ALL
or EXTR_PREFIX_INVALID
。
flags
处理无效/数字键和冲突的方式由提取决定flags
。它可以是以下值之一:
EXTR_OVERWRITE
如果发生冲突,请覆盖现有变量。 EXTR_SKIP
如果发生冲突,请勿覆盖现有变量。 EXTR_PREFIX_SAME
如果发生冲突,请在变量名前加上prefix
。 EXTR_PREFIX_ALL
用所有变量名前缀prefix
。 EXTR_PREFIX_INVALID
只能使用前缀无效/数字变量名称prefix
。 EXTR_IF_EXISTS
如果它已经存在于当前符号表中,则只覆盖该变量,否则不执行任何操作。例如,这对于定义有效变量列表非常有用,然后仅提取您在$ _REQUEST之外定义的那些变量。 EXTR_PREFIX_IF_EXISTS
如果当前符号表中存在相同变量的非前缀版本,则只创建前缀变量名称。 EXTR_REFS
提取变量作为参考。这实际上意味着导入变量的值仍然引用array
参数的值。您可以单独使用此标志,也可以通过“或”将它与任何其他标志组合在一起flags
。
如果flags
没有指定,则认为是EXTR_OVERWRITE
。
prefix
需要注意的是prefix
只需要如果flags
是EXTR_PREFIX_SAME
,EXTR_PREFIX_ALL
,EXTR_PREFIX_INVALID
或EXTR_PREFIX_IF_EXISTS
。如果前缀结果不是有效的变量名称,则它不会导入到符号表中。前缀通过下划线字符自动从数组键中分离出来。
返回值
返回成功导入符号表的变量数。
例子
示例#1 extract()示例
extract()的
一个可能用途是将符号表导入wddx_deserialize()返回的关联数组中包含的变量。
<?php
/* Suppose that $var_array is an array returned from
wddx_deserialize */
$size = "large";
$var_array = array("color" => "blue",
"size" => "medium",
"shape" => "sphere"
extract($var_array, EXTR_PREFIX_SAME, "wddx"
echo "$color, $size, $shape, $wddx_size\n";
?>
上面的例子将输出:
blue, large, sphere, medium
$ size没有被覆盖,因为我们指定了EXTR_PREFIX_SAME
,导致$ wddx_size被创建。如果EXTR_SKIP
被指定,那么$ wddx_size甚至不会被创建。EXTR_OVERWRITE
会导致$ size的值为“medium”,并且EXTR_PREFIX_ALL
会导致名为$ wddx_color,$ wddx_size和$ wddx_shape的新变量。
笔记
警告
不要对不受信任的数据使用extract()
,如用户输入(例如$ _GET,$ _FILES等)。如果你这样做,例如,如果你想暂时运行依赖于register_globals的旧代码,请确保你使用了其中一个非覆盖flags
值,例如,EXTR_SKIP
并且知道你应该按照在php.ini中的variables_order中定义的相同顺序来提取。
注意:如果您仍然有register_globals并且它已打开,如果您在$ _FILES上使用extract()并指定EXTR_SKIP,您可能会对结果感到惊讶。 警告 这不是建议的做法,只有在这里记录完整性。不赞成使用register_globals,并调用extract()对于不可信数据如$ _FILES,如上所述,存在潜在的安全风险。如果遇到此问题,这意味着您至少使用了两种不良编码做法。<?php / \ *假设$ testfile是文件上传输入的名称,并且该寄存器\ _globals已打开。\ * / var \ _dump($ testfile); 提取($ \ _ FILES,EXTR \ _SKIP); 无功\ _dump($ testfile的); VAR \ _dump($ testfile的[ 'TMP \ _name']); (14)“/ tmp / phpgCCPX8”array(5){“name”=> string(10)“somefile.txt”“type”=> string(24) “tmp_name”=> string(14)“/ tmp / phpgCCPX8”“error”=> int(0)“size”=> int(4208)} string(14)“/ tmp / phpgCCPX8”application / octet-stream“ “但是,register_globals已打开,当调用extract()时,$ testfile已存在于全局范围中。由于EXTR_SKIP被指定,$ testfile不会被$_FILES数组的内容覆盖,因此$ testfile仍然是一个字符串。因为可以使用数组语法访问字符串,并且非数字字符串tmp_name被解释为0,所以PHP将$ testfile'tmp_name'视为$ testfile0。