Source of file DirectoryScanner.php
Size: 7,019 Bytes - Last Modified: 2014-03-12T23:21:18+01:00
/home/theseer/Downloads/ZendFramework-2.3.0/library/Zend/Code/Scanner/DirectoryScanner.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273 | <?php /** * Zend Framework (http://framework.zend.com/) * * @link http://github.com/zendframework/zf2 for the canonical source repository * @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ namespace Zend\Code\Scanner; use RecursiveDirectoryIterator; use RecursiveIteratorIterator; use Zend\Code\Exception; class DirectoryScanner implements ScannerInterface { /** * @var bool */ protected $isScanned = false; /** * @var string[]|DirectoryScanner[] */ protected $directories = array(); /** * @var FileScanner[] */ protected $fileScanners = array(); /** * @var array */ protected $classToFileScanner = null; /** * @param null|string|array $directory */ public function __construct($directory = null) { if ($directory) { if (is_string($directory)) { $this->addDirectory($directory); } elseif (is_array($directory)) { foreach ($directory as $d) { $this->addDirectory($d); } } } } /** * @param DirectoryScanner|string $directory * @return void * @throws Exception\InvalidArgumentException */ public function addDirectory($directory) { if ($directory instanceof DirectoryScanner) { $this->directories[] = $directory; } elseif (is_string($directory)) { $realDir = realpath($directory); if (!$realDir || !is_dir($realDir)) { throw new Exception\InvalidArgumentException(sprintf( 'Directory "%s" does not exist', $realDir )); } $this->directories[] = $realDir; } else { throw new Exception\InvalidArgumentException( 'The argument provided was neither a DirectoryScanner or directory path' ); } } /** * @param DirectoryScanner $directoryScanner * @return void */ public function addDirectoryScanner(DirectoryScanner $directoryScanner) { $this->addDirectory($directoryScanner); } /** * @param FileScanner $fileScanner * @return void */ public function addFileScanner(FileScanner $fileScanner) { $this->fileScanners[] = $fileScanner; } /** * @return void */ protected function scan() { if ($this->isScanned) { return; } // iterate directories creating file scanners foreach ($this->directories as $directory) { if ($directory instanceof DirectoryScanner) { $directory->scan(); if ($directory->fileScanners) { $this->fileScanners = array_merge($this->fileScanners, $directory->fileScanners); } } else { $rdi = new RecursiveDirectoryIterator($directory); foreach (new RecursiveIteratorIterator($rdi) as $item) { if ($item->isFile() && pathinfo($item->getRealPath(), PATHINFO_EXTENSION) == 'php') { $this->fileScanners[] = new FileScanner($item->getRealPath()); } } } } $this->isScanned = true; } /** * @todo implement method */ public function getNamespaces() { // @todo } /** * @param bool $returnFileScanners * @return array */ public function getFiles($returnFileScanners = false) { $this->scan(); $return = array(); foreach ($this->fileScanners as $fileScanner) { $return[] = ($returnFileScanners) ? $fileScanner : $fileScanner->getFile(); } return $return; } /** * @return array */ public function getClassNames() { $this->scan(); if ($this->classToFileScanner === null) { $this->createClassToFileScannerCache(); } return array_keys($this->classToFileScanner); } /** * @param bool $returnDerivedScannerClass * @return array */ public function getClasses($returnDerivedScannerClass = false) { $this->scan(); if ($this->classToFileScanner === null) { $this->createClassToFileScannerCache(); } $returnClasses = array(); foreach ($this->classToFileScanner as $className => $fsIndex) { $classScanner = $this->fileScanners[$fsIndex]->getClass($className); if ($returnDerivedScannerClass) { $classScanner = new DerivedClassScanner($classScanner, $this); } $returnClasses[] = $classScanner; } return $returnClasses; } /** * @param string $class * @return bool */ public function hasClass($class) { $this->scan(); if ($this->classToFileScanner === null) { $this->createClassToFileScannerCache(); } return (isset($this->classToFileScanner[$class])); } /** * @param string $class * @param bool $returnDerivedScannerClass * @return ClassScanner|DerivedClassScanner * @throws Exception\InvalidArgumentException */ public function getClass($class, $returnDerivedScannerClass = false) { $this->scan(); if ($this->classToFileScanner === null) { $this->createClassToFileScannerCache(); } if (!isset($this->classToFileScanner[$class])) { throw new Exception\InvalidArgumentException('Class not found.'); } /** @var FileScanner $fs */ $fs = $this->fileScanners[$this->classToFileScanner[$class]]; $returnClass = $fs->getClass($class); if (($returnClass instanceof ClassScanner) && $returnDerivedScannerClass) { return new DerivedClassScanner($returnClass, $this); } return $returnClass; } /** * Create class to file scanner cache * * @return void */ protected function createClassToFileScannerCache() { if ($this->classToFileScanner !== null) { return; } $this->classToFileScanner = array(); /** @var FileScanner $fileScanner */ foreach ($this->fileScanners as $fsIndex => $fileScanner) { $fsClasses = $fileScanner->getClassNames(); foreach ($fsClasses as $fsClassName) { $this->classToFileScanner[$fsClassName] = $fsIndex; } } } /** * Export * * @todo implement method */ public static function export() { // @todo } /** * __ToString * * @todo implement method */ public function __toString() { // @todo } } |