Php 递归函数中的变量表现为全局变量

Php 递归函数中的变量表现为全局变量,php,global-variables,Php,Global Variables,我有一个递归函数,用来打印目录的内容。这是密码 function dirs($dir, $tab) { $d = opendir($dir); while ( ($name = readdir($d)) !== false ) { if ( $name == "." or $name == ".." ) continue; if ( is_dir($dir . '/' . $name) ) {

我有一个递归函数,用来打印目录的内容。这是密码

function dirs($dir, $tab) {
    $d = opendir($dir);
        while ( ($name = readdir($d)) !== false ) {
            if ( $name == "." or $name == ".." ) continue;
            if ( is_dir($dir . '/' . $name) ) {
                echo "<b>" . $tab . "[$name]</b><br>";
                $tab .= "-";
                dirs($dir . '/' . $name, $tab);
            }
            else {
                echo $tab . $name . '<br>';
            }
        }
        closedir($d);
}
dirs("C:/php5", "");
但不是这样

[dev]
-php5ts.lib
[ext]
-php_bz2.dll
-php_curl.dll
-php_enchant.dll
-php_exif.dll
-etc.
[extras]
glib-2.dll
gmodule-2.dll
icudt.dll
icudt46.dll
etc.
问题是为什么“$tab”作为全局变量而不是局部变量


提前感谢。

问题在于,您实际上是在重新分配
$tab
的本地副本的值,而实际上您要做的是将
$tab.
传递到下一个迭代

因为您已经重新分配了它,所以在内部迭代执行之后,它将在外部迭代中继续具有新值

更改:

$tab .= "-";
dirs($dir . '/' . $name, $tab);
简单地说:

dirs($dir . '/' . $name, $tab . '-');

您将$tab传递给函数,并且没有任何东西可以重新初始化$tab,因此每次它通过时,它都会选择一个新的“-”

每次完成目录内容时,都需要删除“-”

与添加“-”不同,我建议您使用整数跟踪级别,并使用整数添加所需数量的“-”



废话。达维兰多姆的答案要简单得多。

$tab=。"-"; 无效语法…抱歉,朋友。我不太明白这个问题?对不起,$tab.=“-”;(已更改)问题是$tab在每次递归中越来越多地使用“-”,就好像它是一个全局变量一样。如果我更改
$tab.=“-”
$tab2=$tab。"-";
并在
dirs($dir.'/'.$name,$tab2)中使用$tab2而不是$tab代码工作正常。
dirs($dir . '/' . $name, $tab . '-');