PHP extract()函数的意外行为

时间:2018-09-19 06:40:49

标签: php

我试图弄清楚EXTR_PREFIX_IF_EXISTS函数中extract()标志的行为。但是,当我运行代码时,它向当前符号表添加了超出所需数量的变量(本例中为两个),如以下行所示:输出表明添加了三个变量而不是两个变量,并且存在变量“ key3”。现在,我无法弄清楚是什么原因导致了这种行为,或者我是否误解了这个概念。我是PHP新手。任何帮助将不胜感激。

我的代码:

$key1 = 'old';
$key2 = 'old';
$my_array = array (
    'key1'  => 'new value1',
    'key2'  => 'new value2',
    'key3'  => 'new value3'
);

$num = extract ($my_array, EXTR_PREFIX_IF_EXISTS, "prefixed");
echo "variables added:$num<br />"; //number of variables imported to symbol table
echo isset($key1) ? 'TRUE': 'FALSE';
echo "<br />";// true
echo isset($prefixed_key3) ? 'TRUE': 'FALSE'; 
echo "<br />";
echo isset($key3) ? 'TRUE': 'FALSE';// should output false

输出:

添加的变量:3


1 个答案:

答案 0 :(得分:1)

 EXTR_PREFIX_IF_EXISTS

表示在发生名称冲突时,先将现有变量名加前缀,然后再将变量提取到作用域中;如果没有冲突,则创建一个新变量。在您的情况下,您没有在任何地方定义$Key3extract函数之前,因此实际行为是完全正常的...

在您的代码提取中,实际上是这样进行的:

循环遍历数组,并检查变量是否已存在。如果存在,根据您的标志,创建一个名为prefix+_+the existing name的新变量。 在您的情况下,您已经在使用$key1 and $key2之前定义了extract,所以创建了两个带有前缀名称的变量,但是正如已经说过的,变量$key3extract之前是未定义的,因此它还有一个没有前缀的变量。这样可以使添加的变量数正确(在您的情况下为 3 )。