2010-08-24 2 views
3
class styleFinder{ 

function styleFinder(){ 

} 

function getFilesNFolders($folder){ 

    $this->folder = $folder ; 
    if($this->folder==""){ 
     $this->folder = '.'; 
    } 
    if ($handle = opendir($this->folder)) { 
     while (false !== ($file = readdir($handle))) { 
      if ($file != "." && $file != "..") { 
       echo "$file<br /> "; 
       if(is_dir($file)){ 

        echo "<b>" . $file . " is a folder</b><br />&nbsp;&nbsp;&nbsp;with contents "; 
        $this::getFilesNFolders($file); 
        # echo "Found folder"; 
       } 
      } 
     } 
     closedir($handle); 
    } 
} 

} Я бледный, чтобы распечатать полное дерево папок и файлов, скрипт собирается в первые папки и поиск файлов, а затем найти любые вложенные папки, но не вложенные папки (и да есть некоторые). Любые идеи, пожалуйста?проблема вызова метода PHP внутри самой

+3

Почему '::'? Используйте '$ this-> getFilesNFolders ($ file);' для чего-то. – meagar

+1

Статические вызовы создаются с использованием 'self :: method()' или 'parent :: method()', но вы не можете ссылаться на состояние объекта в статическом вызове ('->' не разрешено). Представьте, что статические вызовы являются функциональными: http://en.wikipedia.org/wiki/Functional_programming – cbednarski

+2

За исключением того, что 'parent :: method()' на самом деле не является статическим вызовом. Это вызов, который зависит от типа доступа исходного метода (если к экземпляру оригинала обратился в качестве экземпляра, тогда родительский вызов будет иметь доступ к '$ this'). Так что это особый случай (и неинтуитивный, по меньшей мере) ... – ircmaxell

ответ

7
$this::getFilesNFolders($file); 

должна быть

$this->getFilesNFolders($file); 
2

Доступ к функциям класса делается так:

$this->functionName(): 
0

As другие сказали, что в самом методе вам нужно вызвать getFilesNFolders с $this -> getFilesNFolders($file). Кроме того, способ, которым отправлен код, в конце отсутствует в конце, но поскольку после кода он запускается, это, вероятно, опечатка. Приведенный ниже код работает для меня (я побежал через командную строку, так добавляется код для отступа различных уровней каталогов, а также для вывода \ п-х):

<?php 

class StyleFinder{ 
function StyleFinder(){ 
} 

function getFilesNFolders($folder, $spaces){ 

    $this->folder = $folder ; 
    if($this->folder==""){ 
     $this->folder = '.'; 
    } 
    if ($handle = opendir($this->folder)) { 
     while (false !== ($file = readdir($handle))) { 
      if ($file != "." && $file != "..") { 
       if(is_dir($file)){ 
        echo $spaces . "<b>" . $file . " is a folder</b><br/>&nbsp;&nbsp;&nbsp;with contents:\n"; 
        $this -> getFilesNFolders($file, $spaces . " "); 
       } else { 
        echo $spaces . "$file<br />\n"; 
       } 
      } 
     } 
     closedir($handle); 
    } 
} 
} 

$sf = new StyleFinder(); 
$sf -> getFilesNFolders(".", ""); 

?> 
1

Поскольку ни один не при условии, что до сих пор, вот версия RecursiveDirectoryIterator ваш код:

$iterator = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator('/path/to/directory'), 
     RecursiveIteratorIterator::SELF_FIRST); 

foreach($iterator as $fileObject) { 
    if($fileObject->isDir()) { 
     echo "<strong>$fileObject is a folder:</strong><br>\n"; 
    } else { 
     echo $fileObject, "<br>\n"; 
    } 
} 
+0

Спасибо, Гордон, гораздо больше, чем я ожидал, я понятия не имел, что это существовало! Спасибо всем остальным за то, что они тоже купили. – Phil