1<?php 2 3/** 4 * Hoa 5 * 6 * 7 * @license 8 * 9 * New BSD License 10 * 11 * Copyright © 2007-2017, Hoa community. All rights reserved. 12 * 13 * Redistribution and use in source and binary forms, with or without 14 * modification, are permitted provided that the following conditions are met: 15 * * Redistributions of source code must retain the above copyright 16 * notice, this list of conditions and the following disclaimer. 17 * * Redistributions in binary form must reproduce the above copyright 18 * notice, this list of conditions and the following disclaimer in the 19 * documentation and/or other materials provided with the distribution. 20 * * Neither the name of the Hoa nor the names of its contributors may be 21 * used to endorse or promote products derived from this software without 22 * specific prior written permission. 23 * 24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE 28 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 29 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 30 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 31 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 32 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 33 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 34 * POSSIBILITY OF SUCH DAMAGE. 35 */ 36 37namespace Hoa\Iterator\Recursive; 38 39/** 40 * Class \Hoa\Iterator\Recursive\Directory. 41 * 42 * Extending the SPL RecursiveDirectoryIterator class. 43 * 44 * @copyright Copyright © 2007-2017 Hoa community 45 * @license New BSD License 46 */ 47class Directory extends \RecursiveDirectoryIterator 48{ 49 /** 50 * SplFileInfo classname. 51 * 52 * @var string 53 */ 54 protected $_splFileInfoClass = null; 55 56 /** 57 * Relative path. 58 * 59 * @var string 60 */ 61 protected $_relativePath = 0; 62 63 /** 64 * Workaround for the bug #65136. 65 * 66 * @var string 67 */ 68 private static $_handlePath = null; 69 70 71 72 /** 73 * Constructor. 74 * Please, see \RecursiveDirectoryIterator::__construct() method. 75 * We add the $splFileInfoClass parameter. 76 * 77 * @param string $path Path. 78 * @param int $flags Flags. 79 * @param string $splFileInfoClass SplFileInfo classname. 80 */ 81 public function __construct($path, $flags = null, $splFileInfoClass = null) 82 { 83 if (null === $flags) { 84 parent::__construct($path); 85 } else { 86 parent::__construct($path, $flags); 87 } 88 89 if (null !== self::$_handlePath) { 90 $this->_relativePath = self::$_handlePath; 91 self::$_handlePath = null; 92 } else { 93 $this->_relativePath = $path; 94 } 95 96 $this->setSplFileInfoClass($splFileInfoClass); 97 98 return; 99 } 100 101 /** 102 * Current. 103 * Please, see \RecursiveDirectoryIterator::current() method. 104 * 105 * @return mixed 106 */ 107 public function current() 108 { 109 $out = parent::current(); 110 111 if (null !== $this->_splFileInfoClass && 112 $out instanceof \SplFileInfo) { 113 $out->setInfoClass($this->_splFileInfoClass); 114 $out = $out->getFileInfo(); 115 116 if ($out instanceof \Hoa\Iterator\SplFileInfo) { 117 $out->setRelativePath($this->getRelativePath()); 118 } 119 } 120 121 return $out; 122 } 123 124 /** 125 * Get children. 126 * Please, see \RecursiveDirectoryIterator::getChildren() method. 127 * 128 * @return mixed 129 */ 130 public function getChildren() 131 { 132 self::$_handlePath = $this->getRelativePath(); 133 $out = parent::getChildren(); 134 135 if ($out instanceof \RecursiveDirectoryIterator) { 136 $out->setSplFileInfoClass($this->_splFileInfoClass); 137 } 138 139 return $out; 140 } 141 142 /** 143 * Set SplFileInfo classname. 144 * 145 * @param string $splFileInfoClass SplFileInfo classname. 146 * @return void 147 */ 148 public function setSplFileInfoClass($splFileInfoClass) 149 { 150 $this->_splFileInfoClass = $splFileInfoClass; 151 152 return; 153 } 154 155 /** 156 * Get relative path (if given). 157 * 158 * @return string 159 */ 160 public function getRelativePath() 161 { 162 return $this->_relativePath; 163 } 164} 165