PHP5에는 계층적 데이터 구조를 탐색하고 처리하는 데 도움이 되는 미리 만들어진 인터페이스 세트인 Iterator가 추가되었습니다. 이는 PHP5의 가장 흥미로운 새로운 기능 중 하나입니다.
이러한 반복자는 XML 문서 트리 또는 파일 모음을 처리하는 데 필요한 코드를 크게 줄입니다. ArrayIterator, CachingIterator, LimitIterator, RecursiveIterator, SimpleXMLIterator 및 DirectoryIterator를 포함하여 PHP5에서는 많은 수의 Iterator가 사용됩니다.
DirectoryIterator는 디렉터리의 파일을 빠르고 효율적으로 처리할 수 있습니다. 코딩 과정에서 좀 더 창의성을 발휘하면 DirectoryIterator를 사용하여 중첩된 디렉터리 트리를 재귀적으로 처리할 수도 있습니다. 두 작업 모두 단 몇 줄의 코드를 사용하여 수행할 수 있으며, 이는 "표준" 접근 방식에 비해 크게 개선되었습니다.
단일 수준 디렉터리 처리 먼저 단일 수준 디렉터리 처리라는 간단한 작업부터 시작합니다. 다음 코드(목록 A)를 입력하거나 복사하여 로컬 구성을 반영하도록 디렉터리 경로를 수정합니다.
목록 A
<?php$it = new DirectoryIterator("/tmp/mystuff");foreach($it as $file) {if ( !$it->isDot()) {echo $file . "n";}}?>브라우저에서 이 코드의 출력을 보면 지정된 디렉터리에 있는 파일 목록이 표시됩니다. 어떻게 이런 일이 일어났나요? DirectoryIterator는 디렉토리의 내용을 다시 작성하기 위한 미리 결정된 인터페이스를 제공합니다. 일단 대상 디렉토리의 위치가 샘플링되면 이는 디렉토리의 파일을 나타내는 각 요소를 사용하여 표준 PHP 배열로 처리될 수 있습니다. "." 및 ".." 디렉터리를 각각 필터링하기 위해 isDot() 메서드를 사용합니다.
중첩된 디렉터리 트리 처리 중첩된 디렉터리 트리를 재귀적으로 처리하는 것은 거의 쉽습니다. 이 경우 DirectoryIterator는 단일 수준 디렉터리에서 만나는 모든 개체를 확인하여 파일인지 디렉터리인지 확인해야 합니다. 디렉터리인 경우 한 수준 더 깊이 이동하여 다음 수준의 내용을 확인하세요. 이는 상당히 복잡해 보일 수 있으며 과거에는 일반적으로 15줄 이상의 코드가 필요했습니다.
그러나 PHP5에서는 위의 모든 기능을 결합한 RecursiveIterator와 RecursiveIteratorIterator라는 두 개의 새로운 Iterator만 필요합니다. 목록 B 참조:
목록 B
<?php$it = new RecursiveDirectoryIterator("/tmp");foreach(new RecursiveIteratorIterator($it) as $file) {echo $file . 결과는 시작 디렉터리 아래의 모든 파일과 디렉터리가 나열됩니다. 말할 필요도 없이, 이 재귀 내장 인터페이스는 특정 디렉터리 수준 아래의 모든 파일을 처리해야 하는 경우(예: 디렉터리 트리를 재귀적으로 압축하거나 일련의 중첩된 파일의 그룹/소유자 권한 수정) 매우 편리합니다.
실제 응용 프로그램: 디렉터리 트리 인쇄 그래픽 디렉터리 트리를 인쇄하는 것은 디렉터리 재귀의 일반적인 응용 프로그램입니다. Iterator를 사용하여 이 작업을 처리하는 것은 매우 간단합니다. 왜냐하면 Iterator 클래스 문서에는 이 애플리케이션을 위해 특별히 작성된 인스턴스 클래스가 포함되어 있기 때문입니다. DirectoryTreeIterator(Marcus Boerger 덕분에)는 앞서 설명한 RecursiveIteratorIterator에 대한 기타 개선 사항, 특히 트리 구조의 깊이와 위치를 나타내는 ASCII 태그를 제공합니다.
목록 C에서는 DirectoryTreeIterator의 사용을 보여줍니다.
Listing C
<?php$it = new DirectoryTreeIterator("/tmp/cookbook/");foreach($it as $path) {echo $path . "n";}?>다음은 표시되는 출력의 일부입니다
. -ch01| |-example01.php| |-example01.php| 이러한 DirectoryIterator의 가치를 더 잘 이해하려면 표준 파일 및 디렉터리 기능을 사용하여 이 자습서에 설명된 세 가지 응용 프로그램을 코딩해 보세요.