介绍
按照PHP Documentation,glob
和GlobIterator
初始参数是完全不同的。它不清楚为什么这是如此,但它是明确表示。
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 path
而GlobIterator
将返回SplFileInfo
有其上优点。
从GlobIterator
得到纯净的数组列表:
print_r(array_values(array_map("strval",iterator_to_array($glob2))));
结论
是您的代码将在任何平台上工作至今你做Unit Testing
和保持一致性。我并不需要开始讲的GlobIterator
或Iterator
或glob
的优势,但正确使用时将返回相同的结果
尝试使用'放心__DIR__。 '/ *''而不是''./*''。如果仍然失败,可能与https://bugs.php.net/bug.php?id=55701有关。 – Gordon 2013-05-10 13:29:09