2013-05-06 50 views
3

我正在尝试使用GlobIterator class为什么GlobIterator产生与glob函数不同的输出?

我使用与glob function相同的PATTERN,但GlobIterator产生一个空数组。

例子:

$glob = glob('./*'); 
print_r($glob); 

会给我所有的文件在当前目录中的数组。

但是当我做

$glob = new GlobIterator('./*'); 
print_r(iterator_to_array($glob)); 

结果却Array()其中阵列中的任何项目。

有人可以告诉我为什么会发生这种情况吗?

我已经在Windows 8/Apache 2/PHP 5.3上测试过了。

显然,this works from CLI也在Linux上。

也许这是Windows上的Apache SAPI的错误?

+0

尝试使用'放心__DIR__。 '/ *''而不是''./*''。如果仍然失败,可能与https://bugs.php.net/bug.php?id=55701有关。 – Gordon 2013-05-10 13:29:09

回答

3

介绍

按照PHP DocumentationglobGlobIterator初始参数是完全不同的。它不清楚为什么这是如此,但它是明确表示。

glob

array [glob][3] (string $pattern [, int $flags = 0 ]) 
          ^
           |--- Expects pattern 

GlobIterator

public [GlobIterator::__construct][5] (string $path [, int $flags = FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO ]) 
               ^
               |--- Expects Path 

解决方案

始终使用full path。有看到此错误几次,但如果您使用完整的路径,你可以放心,他们将都返回相同的文件列表

例无需输入完整路径

$path = "./test"; 
$glob1 = glob($path . '/*'); 
print_r($glob1); 

$glob2 = new GlobIterator($path . '/*'); 
print_r(iterator_to_array($glob2)); 

输出

Array 
(
    [0] => ./test/fake.png 
    [1] => ./test/php-logo-virus.jpg 
    [2] => ./test/save 
    [3] => ./test/test.png 
) 
Array 
(
) 

全路径示例

$path = __DIR__ ."/test"; 
$glob1 = glob($path . '/*'); 
print_r($glob1); 

$glob2 = new GlobIterator($path . '/*'); 
print_r(iterator_to_array($glob2)); 

输出

Array 
(
    [0] => C:\lab\stackoverflow/test/fake.png 
    [1] => C:\lab\stackoverflow/test/php-logo-virus.jpg 
    [2] => C:\lab\stackoverflow/test/save 
    [3] => C:\lab\stackoverflow/test/test.png 
) 
Array 
(
    [C:\lab\stackoverflow/test\fake.png] => SplFileInfo Object 
     (
      [pathName:SplFileInfo:private] => C:\lab\stackoverflow/test\fake.png 
      [fileName:SplFileInfo:private] => fake.png 
     ) 

    [C:\lab\stackoverflow/test\php-logo-virus.jpg] => SplFileInfo Object 
     (
      [pathName:SplFileInfo:private] => C:\lab\stackoverflow/test\php-logo-virus.jpg 
      [fileName:SplFileInfo:private] => php-logo-virus.jpg 
     ) 

    [C:\lab\stackoverflow/test\save] => SplFileInfo Object 
     (
      [pathName:SplFileInfo:private] => C:\lab\stackoverflow/test\save 
      [fileName:SplFileInfo:private] => save 
     ) 

    [C:\lab\stackoverflow/test\test.png] => SplFileInfo Object 
     (
      [pathName:SplFileInfo:private] => C:\lab\stackoverflow/test\test.png 
      [fileName:SplFileInfo:private] => test.png 
     ) 

) 

输出不同的格式

正如你所看到$glob1 !== $glob2并不是因为文件不存在,而是因为glob将返回文件的array with string pathGlobIterator将返回SplFileInfo有其上优点。

GlobIterator得到纯净的数组列表:

print_r(array_values(array_map("strval",iterator_to_array($glob2)))); 

结论

是您的代码将在任何平台上工作至今你做Unit Testing和保持一致性。我并不需要开始讲的GlobIteratorIteratorglob的优势,但正确使用时将返回相同的结果

+0

如果您想要使用字符串而不是'SplFileInfo',则还可以使用'CURRENT_AS_PATHNAME'标志。 – hakre 2013-05-23 23:14:52

相关问题