inkonsistent DirectoryIterator + FilterIterator Verhalten in PHP?
Frage
Ich schrieb ein Skript, das die FilterIterator Klasse verwendet, die von dem Standard-PHP Library (SPL) kommt und ich verschiedene behabours accross PHP 5.x Versionen :( Hier ist die accept () Funktion:
public function accept()
{
$current = $this->current();
print_r($current);
return true;
}
und here seine Ausgabe für 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] =>
)
und here, was ich mit dem gleichen Code unter PHP 5.2.5
erhaltenDirectoryIterator Object
(
)
DirectoryIterator Object
(
)
DirectoryIterator Object
(
)
Diese hat die Erlaubnis 755 auf alle Dateien. Was ist mit dat up?
Lösung
Scheint, wie das eigentlich ist OK! Aufrufen von Methoden auf dem scheinbar leeren DirectoryIterator Objekte funktioniert. Die Fragen, die ich hatte waren an anderer Stelle und hatte mit Klonen, diese Objekte zu tun. Scheint PHP 5.3 Klone tief, während 5.2 nicht so alle erhalten die Verweise auf jeder Iteration (oder so ähnlich) getötet. Es ist ein hässliches, un dokumentierte Chaos: PHP saugt
Andere Tipps
Von PHP.net:
- Hinweis: Ab PHP 5.3.0 diese Erweiterung nicht mehr deaktiviert werden kann und daher immer verfügbar.
Möglicherweise Ihre PHP 5.2.5 Konfiguration ist in gewisser Weise unvollständig / falsch? Haben Sie Ihr Fehlerprotokoll leve auf Anzeige Warnungen eingestellt? Wenn nicht, stellen Sie ihn und den Code erneut ausführen, um zu sehen, ob seine Warnungen zu werfen ...