介紹
按照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