|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2008-02-01 21:56 UTC] jordan dot raub at dataxltd dot com
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) {
}
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Fri Oct 24 06:00:01 2025 UTC |
similar result with the latest snapshot... $options not passed string(21) "/virtualhosts/tmp/dir" object(SplFileInfo)#3 (2) { ["pathName":"SplFileInfo":private]=> string(17) "/virtualhosts/tmp" ["fileName":"SplFileInfo":private]=> string(21) "/virtualhosts/tmp/dir" } string(52) "/virtualhosts/tmp/RecursiveDirectoryIteratorTest.php" object(SplFileInfo)#4 (2) { ["pathName":"SplFileInfo":private]=> string(17) "/virtualhosts/tmp" ["fileName":"SplFileInfo":private]=> string(52) "/virtualhosts/tmp/RecursiveDirectoryIteratorTest.php" } $options = 0 string(21) "/virtualhosts/tmp/dir" object(RecursiveDirectoryIterator)#2 (4) { ["pathName":"SplFileInfo":private]=> string(17) "/virtualhosts/tmp" ["fileName":"SplFileInfo":private]=> string(21) "/virtualhosts/tmp/dir" ["glob":"DirectoryIterator":private]=> bool(false) ["subPathName":"RecursiveDirectoryIterator":private]=> string(0) "" } string(52) "/virtualhosts/tmp/RecursiveDirectoryIteratorTest.php" object(RecursiveDirectoryIterator)#2 (4) { ["pathName":"SplFileInfo":private]=> string(17) "/virtualhosts/tmp" ["fileName":"SplFileInfo":private]=> string(52) "/virtualhosts/tmp/RecursiveDirectoryIteratorTest.php" ["glob":"DirectoryIterator":private]=> bool(false) ["subPathName":"RecursiveDirectoryIterator":private]=> string(0) "" } $options = 10 string(21) "/virtualhosts/tmp/dir" object(SplFileInfo)#3 (2) { ["pathName":"SplFileInfo":private]=> string(17) "/virtualhosts/tmp" ["fileName":"SplFileInfo":private]=> string(21) "/virtualhosts/tmp/dir" } string(52) "/virtualhosts/tmp/RecursiveDirectoryIteratorTest.php" object(SplFileInfo)#2 (2) { ["pathName":"SplFileInfo":private]=> string(17) "/virtualhosts/tmp" ["fileName":"SplFileInfo":private]=> string(52) "/virtualhosts/tmp/RecursiveDirectoryIteratorTest.php" } $options = 100 string(3) "dir" object(RecursiveDirectoryIterator)#4 (3) { ["pathName":"SplFileInfo":private]=> string(17) "/virtualhosts/tmp" ["glob":"DirectoryIterator":private]=> bool(false) ["subPathName":"RecursiveDirectoryIterator":private]=> string(0) "" } string(34) "RecursiveDirectoryIteratorTest.php" object(RecursiveDirectoryIterator)#4 (3) { ["pathName":"SplFileInfo":private]=> string(17) "/virtualhosts/tmp" ["glob":"DirectoryIterator":private]=> bool(false) ["subPathName":"RecursiveDirectoryIterator":private]=> string(0) "" } $options = 110 string(3) "dir" object(SplFileInfo)#3 (2) { ["pathName":"SplFileInfo":private]=> string(17) "/virtualhosts/tmp" ["fileName":"SplFileInfo":private]=> string(21) "/virtualhosts/tmp/dir" } string(34) "RecursiveDirectoryIteratorTest.php" object(SplFileInfo)#4 (2) { ["pathName":"SplFileInfo":private]=> string(17) "/virtualhosts/tmp" ["fileName":"SplFileInfo":private]=> string(52) "/virtualhosts/tmp/RecursiveDirectoryIteratorTest.php" }looking through the code it looks like DIT_CTOR_FLAGS shouldn't be sent for the RecursiveDirectoryIterator. Maybe another flag should be sent (RDIT_CTOR_FLAGS = 0x00000010) and the flags sent to the parse_parameters should be default SPL_FILE_DIR_CURRENT_AS_SELF to denote that "this" should be a RecursiveDirectoryIterator? $options not passed string(21) "/virtualhosts/tmp/dir" object(SplFileInfo)#3 (2) { ["pathName":"SplFileInfo":private]=> string(17) "/virtualhosts/tmp" ["fileName":"SplFileInfo":private]=> string(21) "/virtualhosts/tmp/dir" } string(52) "/virtualhosts/tmp/RecursiveDirectoryIteratorTest.php" object(SplFileInfo)#4 (2) { ["pathName":"SplFileInfo":private]=> string(17) "/virtualhosts/tmp" ["fileName":"SplFileInfo":private]=> string(52) "/virtualhosts/tmp/RecursiveDirectoryIteratorTest.php" } $options = 0 string(21) "/virtualhosts/tmp/dir" object(RecursiveDirectoryIterator)#2 (4) { ["pathName":"SplFileInfo":private]=> string(17) "/virtualhosts/tmp" ["fileName":"SplFileInfo":private]=> string(21) "/virtualhosts/tmp/dir" ["glob":"DirectoryIterator":private]=> bool(false) ["subPathName":"RecursiveDirectoryIterator":private]=> string(0) "" } string(52) "/virtualhosts/tmp/RecursiveDirectoryIteratorTest.php" object(RecursiveDirectoryIterator)#2 (4) { ["pathName":"SplFileInfo":private]=> string(17) "/virtualhosts/tmp" ["fileName":"SplFileInfo":private]=> string(52) "/virtualhosts/tmp/RecursiveDirectoryIteratorTest.php" ["glob":"DirectoryIterator":private]=> bool(false) ["subPathName":"RecursiveDirectoryIterator":private]=> string(0) "" } $options = 10 string(21) "/virtualhosts/tmp/dir" object(SplFileInfo)#3 (2) { ["pathName":"SplFileInfo":private]=> string(17) "/virtualhosts/tmp" ["fileName":"SplFileInfo":private]=> string(21) "/virtualhosts/tmp/dir" } string(52) "/virtualhosts/tmp/RecursiveDirectoryIteratorTest.php" object(SplFileInfo)#2 (2) { ["pathName":"SplFileInfo":private]=> string(17) "/virtualhosts/tmp" ["fileName":"SplFileInfo":private]=> string(52) "/virtualhosts/tmp/RecursiveDirectoryIteratorTest.php" } $options = 100 string(3) "dir" object(RecursiveDirectoryIterator)#4 (3) { ["pathName":"SplFileInfo":private]=> string(17) "/virtualhosts/tmp" ["glob":"DirectoryIterator":private]=> bool(false) ["subPathName":"RecursiveDirectoryIterator":private]=> string(0) "" } string(34) "RecursiveDirectoryIteratorTest.php" object(RecursiveDirectoryIterator)#4 (3) { ["pathName":"SplFileInfo":private]=> string(17) "/virtualhosts/tmp" ["glob":"DirectoryIterator":private]=> bool(false) ["subPathName":"RecursiveDirectoryIterator":private]=> string(0) "" } $options = 110 string(3) "dir" object(SplFileInfo)#3 (2) { ["pathName":"SplFileInfo":private]=> string(17) "/virtualhosts/tmp" ["fileName":"SplFileInfo":private]=> string(21) "/virtualhosts/tmp/dir" } string(34) "RecursiveDirectoryIteratorTest.php" object(SplFileInfo)#4 (2) { ["pathName":"SplFileInfo":private]=> string(17) "/virtualhosts/tmp" ["fileName":"SplFileInfo":private]=> string(52) "/virtualhosts/tmp/RecursiveDirectoryIteratorTest.php" }had to reopen it. php5.3cvs works fine but php5.2cvs fixed the error but put added a bug.. php5.3cvs works fine. the test script I ran now give the appropriate output: $options not passed string(21) "/virtualhosts/tmp/dir" object(RecursiveDirectoryIterator)#1 (4) { ["pathName":"SplFileInfo":private]=> string(17) "/virtualhosts/tmp" ["fileName":"SplFileInfo":private]=> string(21) "/virtualhosts/tmp/dir" ["glob":"DirectoryIterator":private]=> bool(false) ["subPathName":"RecursiveDirectoryIterator":private]=> string(0) "" } string(52) "/virtualhosts/tmp/RecursiveDirectoryIteratorTest.php" object(RecursiveDirectoryIterator)#1 (4) { ["pathName":"SplFileInfo":private]=> string(17) "/virtualhosts/tmp" ["fileName":"SplFileInfo":private]=> string(52) "/virtualhosts/tmp/RecursiveDirectoryIteratorTest.php" ["glob":"DirectoryIterator":private]=> bool(false) ["subPathName":"RecursiveDirectoryIterator":private]=> string(0) "" } $options = 0 string(21) "/virtualhosts/tmp/dir" object(RecursiveDirectoryIterator)#2 (4) { ["pathName":"SplFileInfo":private]=> string(17) "/virtualhosts/tmp" ["fileName":"SplFileInfo":private]=> string(21) "/virtualhosts/tmp/dir" ["glob":"DirectoryIterator":private]=> bool(false) ["subPathName":"RecursiveDirectoryIterator":private]=> string(0) "" } string(52) "/virtualhosts/tmp/RecursiveDirectoryIteratorTest.php" object(RecursiveDirectoryIterator)#2 (4) { ["pathName":"SplFileInfo":private]=> string(17) "/virtualhosts/tmp" ["fileName":"SplFileInfo":private]=> string(52) "/virtualhosts/tmp/RecursiveDirectoryIteratorTest.php" ["glob":"DirectoryIterator":private]=> bool(false) ["subPathName":"RecursiveDirectoryIterator":private]=> string(0) "" } $options = 10 string(21) "/virtualhosts/tmp/dir" object(SplFileInfo)#4 (2) { ["pathName":"SplFileInfo":private]=> string(17) "/virtualhosts/tmp" ["fileName":"SplFileInfo":private]=> string(21) "/virtualhosts/tmp/dir" } string(52) "/virtualhosts/tmp/RecursiveDirectoryIteratorTest.php" object(SplFileInfo)#2 (2) { ["pathName":"SplFileInfo":private]=> string(17) "/virtualhosts/tmp" ["fileName":"SplFileInfo":private]=> string(52) "/virtualhosts/tmp/RecursiveDirectoryIteratorTest.php" } $options = 100 string(3) "dir" object(RecursiveDirectoryIterator)#1 (3) { ["pathName":"SplFileInfo":private]=> string(17) "/virtualhosts/tmp" ["glob":"DirectoryIterator":private]=> bool(false) ["subPathName":"RecursiveDirectoryIterator":private]=> string(0) "" } string(34) "RecursiveDirectoryIteratorTest.php" object(RecursiveDirectoryIterator)#1 (3) { ["pathName":"SplFileInfo":private]=> string(17) "/virtualhosts/tmp" ["glob":"DirectoryIterator":private]=> bool(false) ["subPathName":"RecursiveDirectoryIterator":private]=> string(0) "" } $options = 110 string(3) "dir" object(SplFileInfo)#4 (2) { ["pathName":"SplFileInfo":private]=> string(17) "/virtualhosts/tmp" ["fileName":"SplFileInfo":private]=> string(21) "/virtualhosts/tmp/dir" } string(34) "RecursiveDirectoryIteratorTest.php" object(SplFileInfo)#1 (2) { ["pathName":"SplFileInfo":private]=> string(17) "/virtualhosts/tmp" ["fileName":"SplFileInfo":private]=> string(52) "/virtualhosts/tmp/RecursiveDirectoryIteratorTest.php" } but php5.2cvs gives me: $options not passed string(3) "dir" object(RecursiveDirectoryIterator)#1 (0) { } string(34) "RecursiveDirectoryIteratorTest.php" object(RecursiveDirectoryIterator)#1 (0) { } $options = 0 string(3) "dir" object(RecursiveDirectoryIterator)#2 (0) { } string(34) "RecursiveDirectoryIteratorTest.php" object(RecursiveDirectoryIterator)#2 (0) { } $options = 10 string(3) "dir" object(SplFileInfo)#4 (0) { } string(34) "RecursiveDirectoryIteratorTest.php" object(SplFileInfo)#2 (0) { } $options = 0 string(3) "dir" object(RecursiveDirectoryIterator)#1 (0) { } string(34) "RecursiveDirectoryIteratorTest.php" object(RecursiveDirectoryIterator)#1 (0) { } $options = 10 string(3) "dir" object(SplFileInfo)#4 (0) { } string(34) "RecursiveDirectoryIteratorTest.php" object(SplFileInfo)#1 (0) { } notice the KEY_AS_FILENAME constant isn't working as it is in php5.3 cvs.. php5.2 ext/spl/spl_directory.h:102:#define SPL_FILE_DIR_KEY_AS_FILENAME 0x00000000 /* make RecursiveDirectoryTree::key() return getFilename() */ php5.3 ext/spl/spl_directory.h:102:#define SPL_FILE_DIR_KEY_AS_FILENAME 0x00000100 /* make RecursiveDirectoryTree::key() return getFilename() */ thanks again :)Broken again... here it is from a snapshot... looks like CURRENT_AS_FILEINFO == 0 now $options not passed string(52) "/virtualhosts/tmp/RecursiveDirectoryIteratorTest/dir" object(SplFileInfo)#3 (0) { } string(83) "/virtualhosts/tmp/RecursiveDirectoryIteratorTest/RecursiveDirectoryIteratorTest.php" object(SplFileInfo)#4 (0) { } $options = 0 string(52) "/virtualhosts/tmp/RecursiveDirectoryIteratorTest/dir" object(SplFileInfo)#3 (0) { } string(83) "/virtualhosts/tmp/RecursiveDirectoryIteratorTest/RecursiveDirectoryIteratorTest.php" object(SplFileInfo)#4 (0) { } $options = 0 string(52) "/virtualhosts/tmp/RecursiveDirectoryIteratorTest/dir" object(SplFileInfo)#3 (0) { } string(83) "/virtualhosts/tmp/RecursiveDirectoryIteratorTest/RecursiveDirectoryIteratorTest.php" object(SplFileInfo)#4 (0) { } $options = 100 string(3) "dir" object(SplFileInfo)#3 (0) { } string(34) "RecursiveDirectoryIteratorTest.php" object(SplFileInfo)#4 (0) { } $options = 100 string(3) "dir" object(SplFileInfo)#3 (0) { } string(34) "RecursiveDirectoryIteratorTest.php" object(SplFileInfo)#4 (0) { }patch.... diff php5.2-200809302030/ext/spl/spl_directory.c php52/ext/spl/spl_directory.c 683,686c683 < } else if (SPL_FILE_DIR_CURRENT(intern, SPL_FILE_DIR_CURRENT_AS_FILEINFO)) { < spl_filesystem_object_get_file_name(intern TSRMLS_CC); < spl_filesystem_object_create_type(0, intern, SPL_FS_INFO, NULL, return_value TSRMLS_CC); < } else { --- > } else if (SPL_FILE_DIR_CURRENT(intern, SPL_FILE_DIR_CURRENT_AS_SELF)) { 688a686,688 > } else { > spl_filesystem_object_get_file_name(intern TSRMLS_CC); > spl_filesystem_object_create_type(0, intern, SPL_FS_INFO, NULL, return_value TSRMLS_CC); 966c966 < long flags = SPL_FILE_DIR_KEY_AS_PATHNAME|SPL_FILE_DIR_CURRENT_AS_FILEINFO; --- > long flags = SPL_FILE_DIR_KEY_AS_PATHNAME|SPL_FILE_DIR_CURRENT_AS_SELF; 1258c1258,1260 < } else if (SPL_FILE_DIR_CURRENT(object, SPL_FILE_DIR_CURRENT_AS_FILEINFO)) { --- > } else if (SPL_FILE_DIR_CURRENT(object, SPL_FILE_DIR_CURRENT_AS_SELF)) { > *data = (zval**)&iterator->intern.data; > } else { 1265,1266d1266 < } else { < *data = (zval**)&iterator->intern.data; diff php5.2-200809302030/ext/spl/spl_directory.h php52/ext/spl/spl_directory.h 96,97c96,97 < #define SPL_FILE_DIR_CURRENT_AS_FILEINFO 0x00000000 /* make RecursiveDirectoryTree::current() return SplFileInfo */ < #define SPL_FILE_DIR_CURRENT_AS_SELF 0x00000010 /* make RecursiveDirectoryTree::current() return getSelf() */ --- > #define SPL_FILE_DIR_CURRENT_AS_FILEINFO 0x00000010 /* make RecursiveDirectoryTree::current() return SplFileInfo */ > #define SPL_FILE_DIR_CURRENT_AS_SELF 0x00000000 /* make RecursiveDirectoryTree::current() return getSelf() */ UnitTest --TEST-- Bug #44018 (RecursiveDirectoryIterator options inconsistancy) --FILE-- <?php foreach(new RecursiveDirectoryIterator(dirname(dirname(__FILE__))) as $key => $file) { if(strpos($key, '/tests') !== false) { echo get_class($file) . "\n"; } } $options = 0; foreach(new RecursiveDirectoryIterator(dirname(dirname(__FILE__)), $options) as $key => $file) { if(strpos($key, '/tests') !== false) { echo get_class($file) . "\n"; } } $options = RecursiveDirectoryIterator::CURRENT_AS_FILEINFO; foreach(new RecursiveDirectoryIterator(dirname(dirname(__FILE__)), $options) as $key => $file) { if(strpos($key, '/tests') !== false) { echo get_class($file) . "\n"; } } $options = RecursiveDirectoryIterator::KEY_AS_FILENAME; foreach(new RecursiveDirectoryIterator(dirname(dirname(__FILE__)), $options) as $key => $file) { if('tests' === $key) { echo get_class($file) . "\n"; } } $options = RecursiveDirectoryIterator::CURRENT_AS_FILEINFO | RecursiveDirectoryIterator::KEY_AS_FILENAME; foreach(new RecursiveDirectoryIterator(dirname(dirname(__FILE__)), $options) as $key => $file) { if('tests' === $key) { echo get_class($file) . "\n"; } } ?> --EXPECTF-- RecursiveDirectoryIterator RecursiveDirectoryIterator SplFileInfo RecursiveDirectoryIterator SplFileInfo