incoerente comportamento DirectoryIterator + FilterIterator in PHP?
Domanda
Ho scritto uno script che utilizza la classe FilterIterator che viene dal PHP Standard Library (SPL) e ottengo diverse behabours attraversavano versioni 5.x di PHP :( Qui l'accettare () Funzione:
public function accept()
{
$current = $this->current();
print_r($current);
return true;
}
Ed ecco la sua uscita per PHP 5.3.1:
DirectoryIterator Object
(
[pathName:SplFileInfo:private] => /Users/alex/Sites/dev/php/fscms/content/.
[fileName:SplFileInfo:private] => .
[glob:DirectoryIterator:private] =>
[subPathName:RecursiveDirectoryIterator:private] =>
)
DirectoryIterator Object
(
[pathName:SplFileInfo:private] => /Users/alex/Sites/dev/php/fscms/content/..
[fileName:SplFileInfo:private] => ..
[glob:DirectoryIterator:private] =>
[subPathName:RecursiveDirectoryIterator:private] =>
)
DirectoryIterator Object
(
[pathName:SplFileInfo:private] => /Users/alex/Sites/dev/php/fscms/content/.DS_Store
[fileName:SplFileInfo:private] => .DS_Store
[glob:DirectoryIterator:private] =>
[subPathName:RecursiveDirectoryIterator:private] =>
)
Ed ecco quello che ottengo con lo stesso codice in PHP 5.2.5
DirectoryIterator Object
(
)
DirectoryIterator Object
(
)
DirectoryIterator Object
(
)
Il secondo ha permesso 755 su tutti i file. Whats up con dat?
Soluzione
Sembra che questo è in realtà OK! Chiamare i metodi sul DirectoryIterator apparentemente vuota oggetti opere. I problemi che ho avuto erano altrove e aveva a che fare con la clonazione di questi oggetti. Sembra PHP 5.3 cloni profondo mentre 5.2 non in modo che tutti i riferimenti vengono uccisi ad ogni iterazione (o qualcosa di simile). Il suo un brutto, non-documentata pasticcio: PHP sucks
Altri suggerimenti
Da PHP.net:
- Nota: Dal PHP 5.3.0 questa estensione non può più essere disattivato ed è quindi sempre a disposizione.
Forse il tuo PHP 5.2.5 di configurazione è in qualche modo incompleto / sbagliato? Avete il vostro errore log leve impostato per visualizzare gli avvisi? In caso contrario, regolare ed eseguire di nuovo il codice per vedere se il suo lancio eventuali avvisi ...