Zitat:
Zitat von Asipak Damit kann man rein gar nichts anfangen, wenn man nicht ein Beispiel dazu gesehen hat, wie es gemacht werden sollte und warum alles andere Mist ist. |
Wenn du gegen konkrete Implementierungen programmierst, legst du dich auf Klasse und Methode fest, z.B. DbMySql->connect(). Bei einem Interface legst du dich nur auf die Methode fest, das Objekt ist egal. Du bist also flexibler. Beispiel:
PHP-Code:
<?php
function showIcon(User $user) {
echo '<img src="/img/icons/', $user->getIconName(), '.png" />';
}
?>
Die Funktion showIcon() erwartet ein User-Objekt und gibt dann einen Icon dafuer aus. So und nun haben wir noch ein Objekt, z.B. einen News-Eintrag, der vielleicht auch gerne als Icon dargestellt werden moechte. showIcon() kopieren und in showIconNewsEntry() umbenennen? Besser waere es nun, die Klassen User und NewsEntry mit einem Interface IconInterface auszustatten:
PHP-Code:
<?php
interface IconInterface {
public function getIconName();
}
// ..
class User implements IconInterface {
// ..
}
class NewsEntry implements IconInterface {
// ..
}
?>
Nun noch showIcon() umgebaut:
PHP-Code:
<?php
function showIcon(IconInterface $icon) {
echo '<img src="/img/icons/', $icon->getIconName(), '" />';
}
?>
und du kannst beide Klassen User und NewsEntry, die eigentlich sonst garnichts miteinander gemein haben mit der selben Funktion showIcon() verwenden und der PHP-Parser garantiert dir die Existenz der Methode getIconName() fuer alles, was an showIcon() uebergeben wurde:
PHP-Code:
<?php
showIcon($user);
showIcon($newsEntry);
?>
Wenn du das nun auf deine Datenbankproblematik uebetraegst merkst du, dass du komplett frei bist was du als "Datenbank"-Klasse uebergibst, hauptsache sie erfuellt das Interface. Du kannst also eine Klasse schreiben, die dir die Daten des Users emailt, in die DB schreibt, in die Session uebernimmt, in eine Datei speichert, garnichts tut, einfach alles. Das wuerdest du ohne Interface nie erreichen koennen.
(am Rande noch: Das Beispiel ist nicht ganz optimal gewaehlt, eine User-Klasse muss nun wirklich nicht wissen wie die Icons im System benannt sind, aber war ja nur ein Beispiel)
Zitat:
|
Mitlerweile komm ich da etwas besser rein.
|
Jetzt hoffentlich vollends
Zitat:
|
Hmm, und wo rufst du den Mangager auf?
|
Direkt vom Controller (MVC), saubere waere vielleicht ein ServiceLocator.
Zitat:
|
Schön und gut, aber genau da liegt ja mein Problem. Wie kann ich dieses Array elegant und unabhängig von allem anderen holen und genauso elegant und unabhängig weiterverwenden?
|
Ist doch ganz einfach:
PHP-Code:
<?php
interface User_Manager_Interface {
public function getUser($id);
}
class User_Manager_Database implements User_Manager_Interface {
public function getUser($userId) {
$sql = "SELECT .. WHERE user_id = $userId";
// ..
$row = mysql_fetch_assoc(..);
$user = new User();
$user->setNickname($row["nickname"]);
return $user;
}
}
class User_Manager_Array implements User_Manager_Interface {
public function getUser($userId) {
$users = array("Peter007", "Peter the Pete", "de Pijd");
$user = new User();
$user->setNickname($users[$userId]);
return $user;
}
}
class User_Manager_File implements User_Manager_Interface {
public function getUser($userId) {
foreach (file("./users.txt") as $line) {
list ($id, $nickname) = explode(";", $line);
if ($userId == $id) {
$user = new User();
$user->setNickname($nickname);
return $user;
}
}
}
}
// ..
$manager1 = new User_Manager_Database();
$manager2 = new User_Manager_Array();
$manager3 = new User_Manager_File();
$user1 = $manager1->getUser(1);
$user2 = $manager2->getUser(2);
$user3 = $manager3->getUser(3);
?>
Schnackelts?
Zitat:
|
Das Problem ist nur, mir fällt nichts mehr ein und wenn ich dann einen Code oder ein Tutorial wie das von dir finde, finde ich keine einzige Datenbankabfrage.
|
Es war zugegeben Quatsch die vorherigen zu veroeffentlichen, wenn ich fuers letzte und interessanteste keine Zeit mehr finde. Aber es kommt noch
