YD_FileReader: Beispiele und Dokumentation
YD_FileReader
ist eine PHP-Klasse zum Verarbeiten von Dateien, die u.a. für das Schreiben von Lexern/Tokenizer gedacht ist. Sie bietet Methoden wie unreadChar()
und findLine()
.
Im Gegensatz zu YD_FileHandle ist dies eine Klasse, die ich in dieser Form brauche. So zählt sie automatisch während des Einlesens die Zeilennummern und Spaltenposition und enthält mit readUntilMatch()
eine Methode, die einen Text solange Zeile für Zeile einliest bis eine bestimmte Zeile gefunden wird (reguläre Ausdruck), was ich z.B. im Preprocessor nutze.
Composing statt Vererbung
Eigentlich ist es ja naheliegend YD_FileReader
von YD_FileHandle
abzuleiten, da YD_FileReader
spezieller als YD_FileHandle
ist. Allerdings bietet YD_FileReader
nur Methoden zum Lesen, während YD_FileHandle
auch Methoden zum Schreiben enthält. In PHP 5 könnte man diese im YD_FileReader
als private
deklarieren und so umbrauchbar machen. Das geht aber zum einen nicht in PHP 4 und zum anderen kann YD_FileHandle
ja jederzeit weitere Methoden bekommen, die nicht in YD_FileReader
reinpassen.
Daher Composing und keine Vererbung.
YD_FileReader
ist also eine eigenständige Klasse, die
jedoch auf YD_FileHandle
zurückgreift.
CLASS YD_File_FileReader extends PEAR - Filereader class { DESCRIPTION Provides methods to read a file, skip lines, find a line and so on. VARS ydFileHandle - $_s = null Use embeded ydFileHandle class. [...] METHOD YD_File_FileReader - Open file { DESCRIPTION Open the file with the given filename. ARGUMENTS string - $filename Name of the file to open. [...] SOURCE $this->_s =& new YD_File_FileHandle($filename, 'rb');
Dokumentation doppelt
Nachteil ist dabei, dass es mit Methoden wie read()
und isEOF()
doch einige gibt, die die beiden Klassen gemeinsam haben. Weshalb für diese Methoden dieselbe Dokumentation in beiden Klassen vorhanden ist und daher auch jedesmal beide aktualsiert werden müssen. Eine sehr fehleranfällige Sache. In PHP 5 könnte man auf Interfaces
zurückgreifen. Da diese Klassen aber für PHP 4 und PHP 5 gedacht sind müsste das dann mit dem Präprocessor gelöst werden, um nicht immer wieder doppeltes drin zu haben.