PHP内置函数extract的使用方法
PHP内置函数extract可以将数组中的元素变成变量,并将它们导入到当前的符号表中。也就是说,extract函数可以从数组中导入键值对作为变量来使用。
语法:
$bool = extract($array, $extract_type, $prefix);
其中,参数
- $array:需要从中导入变量的数组。
- $extract_type:指定将变量作为局部变量导入符号表的方式。默认为EXTR_OVERWRITE。
- $prefix:指定变量名前缀。默认为NULL。
extract_type参数有以下几种选项:
- EXTR_OVERWRITE:默认值。将从数组中提取的键值对作为变量存入符号表,如果符号表中已经有一个同名变量,则会被数组中的值覆盖。
- EXTR_SKIP:如果符号表已经有同名的变量,则不会用数组中的值覆盖它。
- EXTR_PREFIX_SAME:如果符号表中已经有同名的变量,将会用数组中的值来扩展变量名。例如:如果数组中有一个键值对为“foo” => "bar",而 symbol table 中也已经有一个“$foo”变量,则这个数组中提取的键值对将被命名为“$foo_bar”。
- EXTR_PREFIX_ALL:所有从数组中提取的键值对都会被命名为以“$prefix_”开头的新的变量,并存入符号表中。如果“$prefix_”是一个无效的变量名,则从符号表中导入的变量将成为无法访问的。
- EXTR_PREFIX_INVALID:与EXTR_PREFIX_ALL相似,在指定的$prefix之前添加无效变量名称(如数字,连字符等)。如果在添加无效前缀时出错,则会停止导入变量并返回false。注:无效字符以“_”字符表示。
- EXTR_IF_EXISTS:仅在符号表中存在同名变量的情况下才导入键值对。
- EXTR_REFS:将从数组中提取的值作为引用存入符号表中。这意味着修改符号表中的变量也会修改在数组中的原始值。
- EXTR_PREFIX_IF_EXISTS:将只有在符号表中存在同名变量时才使用前缀,否则将使用不带前缀的变量名。
- EXTR_IF_EXISTS:如果符号表中存在同名变量,则将从数组中提取的项导入符号表中,否则将不会导入。
使用示例:
在下面的示例中,我们首先定义一个数组,然后调用 extract() 函数。在此,我们指定了前缀,并使用 EXTR_PREFIX_ALL 将变量作为带前缀的局部变量导入。最后,我们在符号表中访问这些变量。
$array = array('one' => 1, 'two' => 2, 'three' => 3);
extract($array, EXTR_PREFIX_ALL, 'my');
echo $my_one; // 输出 1
echo $my_two; // 输出 2
echo $my_three; // 输出 3
在此,"one"、"two" 和 "three" 都变成了名为 "my_one"、"my_two" 和 "my_three" 的变量。
下一个例子是使用了 EXTR_IF_EXISTS 选项。如果符号表中不存在 "two" 变量,则 extract() 将只导入 "one" 和 "three" 变量。
$array = array('one' => 1, 'two' => 2, 'three' => 3);
extract($array, EXTR_IF_EXISTS);
echo $one; // 输出 1
echo $two; // 不输出任何东西
echo $three; // 输出 3
在第三个示例中,我们使用了 EXTR_REFS 选项。这将把从数组中提取的值作为引用存入符号表中。因此,修改变量也会修改原始数组中的值。
$array = array('one' => 1, 'two' => 2, 'three' => 3);
extract($array, EXTR_REFS);
$one++; // 修改变量值
echo $array['one']; // 输出 2
这里,$one 变量的值增加了 1,在符号表中保存的引用指向 $array 数组中的值,因此这也修改了 $array['one'] 的值。
extract函数可以在一些情况下非常有用,例如在模板中快速地将数组值赋给变量。但是,由于 extract 函数将来自数组的变量导入符号表,因此应谨慎使用。还要注意,从安全角度考虑,不应将未经处理的用户数据传递给 extract 函数。
