在PHP类中从一个函数调用另一个函数

6

我想要扫描目录和子目录,列出xml文件列表,提取xml文件中的内容并显示。这些函数在没有面向对象编程的情况下可以正常工作。我尝试创建一个类。我从函数main调用scandir_through函数。我没有错误,结果也是如此。

class data {
    var $dir = 'D:\wamp4\www\begin';

    public function scandir_through($dir)
     {
         $items = glob($dir . '/*');
         for ($i = 0; $i < count($items); $i++) {
             if (is_dir($items[$i])) {
                 $add = glob($items[$i] . '/*');
                 $items = array_merge($items, $add);
             }
         }
        return $items;
     }

    public function main()
    {
        $scan_tree = $this->scandir_through($dir);
        echo "<ul id='booklist'>"."</n>";
        foreach ($scan_tree as $key=>$file){
            $url = $file;
            $xml = simplexml_load_file($url);  
               $book_count = count($xml->book); 
               for($i = 0; $i < $book_count; $i++) { 
                   $book = $xml->book[$i]; 
                   $title=$xml->book[$i]->title;
                   $author=$xml->book[$i]->author;
                   //echo '</br>';
                   //echo $file. " &nbsp   ";
                   //echo $title. " &nbsp   ";
                   //echo $author;
                   echo "<li><div class='file'>".$file."</div>
                   <div class='title'>".$title."</div>
                   <div class='author'>".$author."</div></li></n>";
               }     
         }  
          echo "</ul>";
    }
}
$d = new data();
$d->main();
?>

1
请记住,PHP是一种多范式语言。你不需要在任何地方都使用面向对象编程。 - lsouza
不好意思,我的错误,复制有误。 - vili
面向对象编程(OOP)是完成此任务所必需的。 - vili
1
请提供$items的输出。 - Vineet1982
3个回答

20
问题出在你的主方法中访问到的$dir实例变量与你原本期望的不一样。(它正在查找该方法范围内的$dir变量,而不是类级别的变量。)
你需要使用的是...
$scan_tree = $this->scandir_through($this->dir);
如果您打开 E_NOTICE 警告,您会发现它已经抛出了一个错误。

我尝试了这个,但是页面是空白的,没有结果。 - vili

3

我认为$dir应该成为main函数的一个参数。想一想,如果在这个类中没有其他内容,那么main函数从哪里获取$dir呢?

我会进行如下更改:

public function main()

为了

public function main($dir)

当您使用 $d 调用 main 函数时,请包含目录,因此将其更改为:

$d->main($dir);

1
如果 $d->main($dir) 不起作用,请尝试不带 since 的方式,因为您已经在类中拥有 $dir。 - user1522901

1
$items=data::scandir_through($dir);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接