echo $begrüßung;
mal konkret: http://molily.de/temp/weblog-recode-pingbacks.phps
Wie würdet ihr so ein Programm strukturieren, also in Klassen, Methoden usw. aufsplitten?
Kommt drauf an. Wenn es ein einmaliges Script ist, das irgendwo als einziges in etwas bestehendes eingebunden werden soll, dann nähme ich sicher den Weg des geringstmöglichen Aufwands. Wenn es sich lohnt kommen vorgefertigte Komponenten zum Einsatz, wenn nicht, wird nur mit Funktionen und vielleicht auch Klassen strukturiert.
Wenn es eine komplexe Anwendung werden soll, muss mehr Aufwand und Strukturierung her.
Bringt dieses »Handler«-Konzept überhaupt was?
Ich denke, es gibt übersichtlichere Mittel.
Ich kommentiere mal einige Teile, sowohl zu deinem Konzept als auch allgemeine Dinge.
/* ####################################################################################### */
/* *********************************************************************************** */
Interessante Kommentare, leider sind es die einzigen ...
class DB {
private $connection;
private $result;
Eine Datenbankklasse erledigt zwar im Allgemeinen alles über eine einzelne Verbindung, jedoch ist es nicht immer so, dass das Ergebnis vollständig ausgewertet ist, bevor eine neue Abfrage gestartet wird. Es in einer Instanzvariable zu halten, halte ich nicht für sinnvoll. Sinnvoller, finde ich, sollte es eine eigene Klasse bilden, oder das komplette Ergebnis sollte per Fetch-Methoden - wie fetchall, fetchone, fetchcol, fetchrow, usw., die das Ergebnis aus einem komplett übergebenen SQL-Statement bilden - an die aufrufende Instanz weitergegeben werden.
function __construct (...) {
return irgendwas;
}
Ein Konstruktor gibt unter PHP5 nur eine Instanz seiner Klasse zurück, nichts anders. Mit return etwas anderes zurückzugeben funktioniert nicht. Das war nur unter PHP4 möglich (möglicherweise auch noch in frühen 5er Versionen). Wenn du unterschiedliche Ergebnisse haben möchtest, verwende das Factory-Pattern.
Im Constructor: $this->connect(...);
Nicht immer ist es sinnvoll, sofort nach Instanziieren der Klasse eine Verbindung aufzubauen, und diese dann erst eine Weile rumliegen zu lassen, bevor eine der Methoden überhaupt eine Verbindung benötigt. Vielleicht braucht es auch gar keine Verbindung, weil wegen eines Fehlers im Vorfeld das DB-Handling abgebrochen wird, dann hat man umsonst eine Ressource belegt. Vorschlag: Jede Methode, die eine Verbindung benötigt, holt sie sich bei einer getConnection-Methode, welche ihrerseits ein geöffnetes DB-Handle zurückgibt und es ggf. vorher initialisiert.
while ($rowObject = pg_fetch_object($this->result))
$objectArray[] = $rowObject;
foreach ($objectArray as $rowObject) ...
Variablen müssen zwar unter PHP nicht initialisiert werden, es ist aber dringend empfehlenswert, das zu tun. Besonders wenn man nur bedingt (if, while, ...) schreibend darauf zugreift, kann es passieren, dass sie nicht existieren. In dem Konstrukt wirft dir das foreach eine Fehlermeldung um die Ohren, wenn die Query eine leere Ergebnismenge zurückliefert und $objektArray keins ist.
(Außerdem ist $rowObject keins, wenn es nichts mehr zu fetchen gibt, sondern false. Das Benennen der Variablen nach ihrem angeblichen Typ halte ich nicht für sonderlich sinnvoll.)
$dataArray[] = '"' . pg_escape_string($fieldName) . '" = '' . pg_escape_string($value) . ''';
PHP kennt eine Funktion namens sprintf, mit der man Strings etwas übersichtlicher zusammenstellen kann: $dataArray[] = sprintf('"%s" = '%s'', pg_escape_string($fieldName), pg_escape_string($value));
$updateClause = implode(', ', $dataArray);
Auch hier ist $dataArray nicht unbedingt eins, weil Schreibzugriffe nur im Körper einer foreach-Schleife stattfanden, der bei leerem Array nicht ausgeführt wird. Und gleich im Anschluss mit $whereArray das gleiche.
Deine Version:
public function analyzePingbacks () {
$this->query(
'SELECT "id", "value" FROM "block_attributes" WHERE "name" = 'pingback'',
'handleSelect',
'handleSelectError'
);
}
Mein Vorschlag:
public function analyzePingbacks () {
try {
$result = $this->query(...);
mach;
was;
mit;
result;
oder
$this->handleResult($result);
} catch(Exception $ex) {
mach;
was;
bei;
fehler;
oder
$this->handleError($ex);
} finally {
ggf. aufräumarbeiten;
}
}
Handler haben ihre Vorzüge im ereignisgesteuerten Umfeld. Da weiß man nie, was als nächstes passiert. Mal wird dieser Handler aufgerufen, mal jener. Sie für ein ereignisloses System nachzubilden halte ich nicht für sehr sinnvoll. Hier hat man den Programmfluss selbst in der Hand. Was aber nicht heißt, dass man nicht sinnvollerweise Teilaufgaben an Funktionen und Methoden deligieren kann.
echo "$verabschiedung $name";