2012-09-21 6 views
43

PHP 5 के बीच अंतर DirectoryIterator, और PHP 5.3 ने FileSystemIterator पेश किया।DirectoryIterator और FileSystemIterator

FileSystemIteratorDirectoryIterator बढ़ाता है, लेकिन दस्तावेज़ीकरण यह कहने में विफल रहता है कि यह कौन सी अतिरिक्त सुविधाएं लाता है।

क्या आप DirectoryIterator और FileSystemIterator के बीच अंतर बता सकते हैं?

+1

अंतर उन हिस्सों के भीतर है जो * फाइल सिस्टम सिस्टम 'मैनुअल पेज पर * दस्तावेज * हैं * जिन्हें * विरासत विधियों के रूप में सूचीबद्ध नहीं किया गया है (वह पृष्ठ इन्हें सूचीबद्ध नहीं करता है, लेकिन कुछ क्लास पेज उनको सूचीबद्ध करते हैं, इसलिए केवल एक पॉइंटर , मैन्युअल पेज पर आप जो कुछ देखते हैं * है * अंतर [कम से कम अभी]]। – hakre

उत्तर

49

यह मेरे सिर में, जहां मैं इन सबसे छुटकारा में पकड़ा गया के शीर्ष के बाहर चला जाता है PHP 5.3 से पहले परिवर्तन जो कि बाद में और बाद में एसपीएल (मानक पीएचपीएलबीआरआईआर) और सामानों के बारे में बदल रहे थे, जो कि भयानक (भयानक) पीईसीएल विस्तार में स्थानांतरित किए जा रहे थे ऑन।

प्रमुख बात यह है कि 5.3 के बाद से बदल गया है, कि एसपीएल एक विस्तार है कि अब और निष्क्रिय नहीं किया जा सकता है, 5.3 की changelog कि

  • जोड़ा गया एसपीएल मानक एक्सटेंशन की सूची है कि निष्क्रिय नहीं किया जा सकता है के लिए ध्यान देने योग्य बात यह देखने बन गया । (मार्कस)

तो DirectoryIterator या SPLDoublyLinkedList की तरह सभी फैंसी कक्षाएं अब कक्षाओं का एक ठीक सूट है कि PHP 5.3 के साथ आया था थे।

वहां कई चर्चाएं चल रही थीं कि निर्देशिकाइटरेटर अभी भी फाइलों/निर्देशिकाओं और व्यवहार से पुन: उपयोग करने में बहुत बेकार था, जो फाइल सिस्टम के लिए पर्याप्त अज्ञात नहीं था। क्योंकि फाइल सिस्टम (विंडोज एनटीएफएस/* निक्स एक्सटीएक्स) के आधार पर परिणामस्वरूप इटेटरेटर दूसरे से भिन्न होता है, जहां *nix प्रति डिफ़ॉल्ट वातावरण हमेशा वैध निर्देशिका के रूप में डॉट और डबल डॉट निर्देशिका (. और ..) के परिणामस्वरूप होते हैं। isDot() विधि का उपयोग करके इन बिंदु निर्देशिका को लूप में फ़िल्टर किया जा सकता है।

$it = new DirectoryIterator(__DIR__); 
foreach ($it as $fileinfo) { 
    if (!$fileinfo->isDot()) 
    var_dump($fileinfo->getFilename()); 
} 

तो FilesystemIterator PHP 5 में नए अभिभावक वर्ग बन गया।3, जो इसकी रिलीज से पहले DirectoryIterator था (जहां FilesystemIterator को डिफ़ॉल्ट रूप से द्वारा परिवर्तनीय व्यवहार को लागू करने के लिए विस्तारित करता है)। व्यवहार, या FilesystemIterator उत्पादित परिणाम है, तो सभी विभिन्न फ़ाइल सिस्टम के बराबर और विनिमेय पाश

$it = new FilesystemIterator(__DIR__); 
foreach ($it as $fileinfo) { 
    echo $fileinfo->getFilename() . "\n"; 
} 

यह एक अच्छा सवाल है कि वे क्यों देख के लिए दस्तावेज़ को अद्यतन नहीं किया है में किसी भी भूमि के ऊपर की आवश्यकता के बिना किया जाएगा इस तथ्य पर उपयोगकर्ता वास्तव में FilesystemIteratorDirectoryIterator से पहले था।

+0

+1: अंतर्दृष्टि साझा करने के लिए बहुत बहुत धन्यवाद। मैंने भी आश्चर्यचकित किया, लेकिन वास्तव में दस्तावेज वास्तव में क्या है और यह एपीआई के लिए सभी डिजाइन निर्णय पथों को दस्तावेज करने के लिए समझ में नहीं आता है। – hakre

+4

हर कोई यहां दस्तावेज़ों को अपडेट कर सकता है: https://edit.php.net/?project=PHP –

13

DirectoryIterator की SplFileInfo

जबकि

FilesystemIteratorDirectoryIterator

का एक विस्तार है एक विस्तार है और दोनों को लागू करता है

Iterator , Traversable , SeekableIterator

FilesystemIterator झंडे जो अपने beha प्रभावित करता है viors जब काम कर रहे हैं जो बहुत उपयोगी हो सकता है जैसे कि FOLLOW_SYMLINKS , SKIP_DOTS etc और इससे इसका अधिकांश अंतर होता है।

आप FilesystemIterator predefined constants

उदाहरण पर पूर्ण झंडे देख सकते हैं

$iterator = new DirectoryIterator(dirname(__FILE__)); 
foreach ($iterator as $fileinfo) { 
    var_dump($fileinfo->current()); // would return object(DirectoryIterator) 
} 

उदाहरण 2

$iterator = new FilesystemIterator(__DIR__, FilesystemIterator::CURRENT_AS_PATHNAME); 
foreach ($iterator as $fileinfo) { 
    var_dump($iterator->current()) . "\n"; // Would return full path eg /www/examples/example.php 
} 
संबंधित मुद्दे