php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 04.09.2009, 00:11  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.268
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Zitat:
Zitat von Asipak Beitrag anzeigen
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
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Hilfe: datenbank mappen und kopieren M*I*B Datenbanken 29 15.02.2012 21:55

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
warum trennung interface implementierung, warum trennung interface und implementierung, php schnittstellen trennung, php trennung schnittstelle implementierung, php datenbank class interface, php datenbank klasse interface, trennung interface und implementierung

Alle Zeitangaben in WEZ +2. Es ist jetzt 00:48 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum