实例变量的OOP问题

时间:2013-09-08 20:14:25

标签: php oop

我的两个类'File'和'Folder'中有一段代码存在问题。我创建了一个页面,向我显示我的服务器空间的内容。因此,我编写了类文件夹,其中包含有关它的信息,如'name','path'和'children'。 children属性包含此文件夹中的“文件”或“文件夹”数组。所以这是一种递归类。为了获得所需目录的整个结构,我编写了一些递归回溯算法,这些算法为我提供了与服务器上的文件夹相同结构的所有子项的对象数组。第二种算法是获取该数组并搜索特殊文件夹。如果找到此文件夹,则该方法将返回其根路径,如果该文件夹不是此目录的子文件夹,则算法将返回false。我已经为'Folder'对象测试了所有这些方法,它运行得很好,但是现在我通过使用更加密集的脚本检测到了错误。

/**
 * find an subfolder within the given directory (Recursive)
 */
public function findFolder($name) {

    // is this object the object you wanted
    if ($this->name == $name) {
        return $this->getPath();
    }

    // getting array
    $this->bindChildren();
    $result = $this->getChildren();

    // backtracking part
    foreach($result as $r) {
        // skip all 'Files'
        if(get_class($r) == 'File') {
            continue;   
        } else {
            if($search_res = $r->findFolder($name)) {
                return $search_res;
            }
        }
    }

    // loop runned out
    return false;

}

/**
 * stores all children of this folder
 */
public function bindChildren() {
    $this->resetContent();
    $this->dirSearch();
}

/**
 * resets children array
 */
private function resetContent() {
    $this->children = array();
}

/**
 * storing children of this folder
 */
private function dirSearch() {
    $dh = opendir($this->path);

    while($file = readdir($dh)) {
        if($file !== "" && $file !== "." && $file !== "..") {
            if(!is_dir($this->path.$file)) {
                $this->children[] = new File($this->path.$file);
            } else {
                $this->children[] = new Folder($this->path.$file.'/');
            }
        }   
    }
}

在我的网站中,我首先创建一个新的文件夹对象,然后我开始找到一个'doc'子文件夹,例如调用'test'。文件夹'test'位于'/ var / www / media / username / doc / test4 / test /',位于

$folder = new Folder('/var/www/media/username/doc/');
$dir = $folder->findFolder('test');

如果我打印出$dir,它会返回我想要的链接,因为文件夹'test'是'docs'的子文件夹,但返回的链接不正确。它应该是'/ var / www / media / username / doc / test4 / test'但结果是'/ var / www / media / username / doc / test'我试过调试一下,发现它包含所有子项的文件夹列表保留具有正确链接的对象,但在第一个if条件中的findFolder方法中,对象$this没有正确的路径。

我不知道为什么
// backtracking part
foreach($result as $r) {

似乎改变了对象属性。我希望有人可以帮助我,并提前致谢

1 个答案:

答案 0 :(得分:0)

不要重新发明轮子。 PHP已经有一个名为RecursiveDirectoryIterator的类。

http://php.net/manual/en/class.recursivedirectoryiterator.php