From: jordan dot raub at dataxltd dot com Operating system: linux PHP version: 5.2.5 PHP Bug Type: SPL related Bug description: RecursiveDirectoryIterator options inconsistancy
Description: ------------ creating a new RecursiveDirectoryIterator with no options passes and 0 as the options passed give 2 different things. for nothing passed the current value is a RecursiveDirectoryIterator while for a 0 passed a SplFileInfo object is passed. I would think that sending in 0 and nothing would give the same thing. Also in RecursiveDirectoryIterator constructor (ext/spl/spl_directory.c line 965 php5.2.5 not CVS) the flags are automatically set to return an SplFileInfo object, should this not be a RecursiveDirectoryIterator? (correct me if i'm wrong) also the documentation has the constants set: const CURRENT_AS_FILEINFO RecursiveDirectoryIterator::x00000010 const KEY_AS_FILENAME RecursiveDirectoryIterator::x00000020 while from this test code they should be the following const CURRENT_AS_FILEINFO RecursiveDirectoryIterator::x00000010 const KEY_AS_FILENAME RecursiveDirectoryIterator::x00000100 Thanks, Jordan Reproduce code: --------------- #!/usr/lib/php5/bin/php <?php printf("\$options not passed\n"); foreach(new RecursiveDirectoryIterator(dirname(__FILE__)) as $key => $file) { var_dump($key); var_dump($file); } $options = 0; printf("\$options = %x\n", $options); foreach(new RecursiveDirectoryIterator(dirname(__FILE__), $options) as $key => $file) { var_dump($key); var_dump($file); } $options = 0; $options |= RecursiveDirectoryIterator::CURRENT_AS_FILEINFO; printf("\$options = %x\n", $options); foreach(new RecursiveDirectoryIterator(dirname(__FILE__), $options) as $key => $file) { var_dump($key); var_dump($file); } $options = 0; $options |= RecursiveDirectoryIterator::KEY_AS_FILENAME; printf("\$options = %x\n", $options); foreach(new RecursiveDirectoryIterator(dirname(__FILE__), $options) as $key => $file) { var_dump($key); var_dump($file); } $options = 0; $options |= RecursiveDirectoryIterator::CURRENT_AS_FILEINFO; $options |= RecursiveDirectoryIterator::KEY_AS_FILENAME; printf("\$options = %x\n", $options); foreach(new RecursiveDirectoryIterator(dirname(__FILE__), $options) as $key => $file) { var_dump($key); var_dump($file); } Expected result: ---------------- $options not passed string(21) "/virtualhosts/tmp/dir" object(RecursiveDirectoryIterator)#2 (0) { } string(52) "/virtualhosts/tmp/RecursiveDirectoryIteratorTest.php" object(RecursiveDirectoryIterator)#2 (0) { } $options = 0 string(21) "/virtualhosts/tmp/dir" object(RecursiveDirectoryIterator)#2 (0) { } string(52) "/virtualhosts/tmp/RecursiveDirectoryIteratorTest.php" object(RecursiveDirectoryIterator)#2 (0) { } $options = 10 string(21) "/virtualhosts/tmp/dir" object(SplFileInfo)#3 (0) { } string(52) "/virtualhosts/tmp/RecursiveDirectoryIteratorTest.php" object(SplFileInfo)#2 (0) { } $options = 100 string(3) "dir" object(RecursiveDirectoryIterator)#4 (0) { } string(34) "RecursiveDirectoryIteratorTest.php" object(RecursiveDirectoryIterator)#4 (0) { } $options = 110 string(3) "dir" object(SplFileInfo)#3 (0) { } string(34) "RecursiveDirectoryIteratorTest.php" object(SplFileInfo)#4 (0) { } Actual result: -------------- $options not passed string(21) "/virtualhosts/tmp/dir" object(SplFileInfo)#3 (0) { } string(52) "/virtualhosts/tmp/RecursiveDirectoryIteratorTest.php" object(SplFileInfo)#4 (0) { } $options = 0 string(21) "/virtualhosts/tmp/dir" object(RecursiveDirectoryIterator)#2 (0) { } string(52) "/virtualhosts/tmp/RecursiveDirectoryIteratorTest.php" object(RecursiveDirectoryIterator)#2 (0) { } $options = 10 string(21) "/virtualhosts/tmp/dir" object(SplFileInfo)#3 (0) { } string(52) "/virtualhosts/tmp/RecursiveDirectoryIteratorTest.php" object(SplFileInfo)#2 (0) { } $options = 100 string(3) "dir" object(RecursiveDirectoryIterator)#4 (0) { } string(34) "RecursiveDirectoryIteratorTest.php" object(RecursiveDirectoryIterator)#4 (0) { } $options = 110 string(3) "dir" object(SplFileInfo)#3 (0) { } string(34) "RecursiveDirectoryIteratorTest.php" object(SplFileInfo)#4 (0) { } -- Edit bug report at http://bugs.php.net/?id=44018&edit=1 -- Try a CVS snapshot (PHP 4.4): http://bugs.php.net/fix.php?id=44018&r=trysnapshot44 Try a CVS snapshot (PHP 5.2): http://bugs.php.net/fix.php?id=44018&r=trysnapshot52 Try a CVS snapshot (PHP 5.3): http://bugs.php.net/fix.php?id=44018&r=trysnapshot53 Try a CVS snapshot (PHP 6.0): http://bugs.php.net/fix.php?id=44018&r=trysnapshot60 Fixed in CVS: http://bugs.php.net/fix.php?id=44018&r=fixedcvs Fixed in release: http://bugs.php.net/fix.php?id=44018&r=alreadyfixed Need backtrace: http://bugs.php.net/fix.php?id=44018&r=needtrace Need Reproduce Script: http://bugs.php.net/fix.php?id=44018&r=needscript Try newer version: http://bugs.php.net/fix.php?id=44018&r=oldversion Not developer issue: http://bugs.php.net/fix.php?id=44018&r=support Expected behavior: http://bugs.php.net/fix.php?id=44018&r=notwrong Not enough info: http://bugs.php.net/fix.php?id=44018&r=notenoughinfo Submitted twice: http://bugs.php.net/fix.php?id=44018&r=submittedtwice register_globals: http://bugs.php.net/fix.php?id=44018&r=globals PHP 3 support discontinued: http://bugs.php.net/fix.php?id=44018&r=php3 Daylight Savings: http://bugs.php.net/fix.php?id=44018&r=dst IIS Stability: http://bugs.php.net/fix.php?id=44018&r=isapi Install GNU Sed: http://bugs.php.net/fix.php?id=44018&r=gnused Floating point limitations: http://bugs.php.net/fix.php?id=44018&r=float No Zend Extensions: http://bugs.php.net/fix.php?id=44018&r=nozend MySQL Configuration Error: http://bugs.php.net/fix.php?id=44018&r=mysqlcfg