![]() |
AW: [PHP] Klassenstruktur für Adressdatenbank
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Danke für die Tipps und Anregungen. |
AW: [PHP] Klassenstruktur für Adressdatenbank
Zitat:
Zitat:
Man holt sich also die Registry Instanz (siehe Singleton Artikel auf Wikipedia unter PHP), verbindet sich im "Bootloader" mit MySQL und speichert die Connection in diese Registry. Die Db_Table Klasse, von der der Kontakt erben sollte, beschafft sich im Konstruktor diese Verbindung, speichert sie in ein Feld und man arbeitet in der Kontakt-Klasse dann einfach mit $this->db. Zitat:
Zitat:
Zitat:
PHP-Quellcode:
function __get($name) { return $this->data->$name; }
Zitat:
Zitat:
Edit:// Was ich jetzt noch gar nicht bemerkt habe! Du hast alle Methoden nicht-statisch gemacht. Das ist nicht ganz so wie es sein sollte. Stell dir vor, dass die Klasse die Tabelle repräsentiert. Eine Instanz der Klasse repräsentiert eine einzige Zeile dieser Tabelle. Möchtest du also einen speziellen Kontakt, rufst du die statische Methode get($id) der Klasse auf. Diese erzeugt eine Instanz ihrer selbst und gibt sie zurück. Weißt du wie ich das meine? Liebe Grüße, Valentin |
AW: [PHP] Klassenstruktur für Adressdatenbank
[OT]
Zitat:
[/OT] |
AW: [PHP] Klassenstruktur für Adressdatenbank
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab hier mal ein kleines UML Diagramm skizziert.
Kursive Klassen sind abstrakt, unterstrichene Methoden sind statisch. Ich garantiere keine Korrektheit oder Vollständigkeit, aber es sollte ungefähr zeigen wie ich mir das vorstelle. :) Liebe Grüße, Valentin |
AW: [PHP] Klassenstruktur für Adressdatenbank
@Valle: Danke, dass du dir da so deinen Kopf zerbrochen hast. Ich werde es versuchen nach und nach umzusetzen. Ich habe mir mal zwei Sachen rausgepickt als nächsten Milestone:
1. Das mit den Exceptions. 2. Auslagern des Verbindunsgaufbaus. Für beides bräuchte ich aber zum Angucken und nachbauen etwas Beispielcode. |
AW: [PHP] Klassenstruktur für Adressdatenbank
So, meine Exceptionklasse sieht jetzt erst mal so aus:
Code:
Ich habe gelesen, dass man den Konstruktor auf alle Fälle überschreiben und dort den Parent-Konstruktor aufrufen soll. Ich denke mal, so hast du dir das vorgestellt.
<?php
class DBException extends Exception { public function __construct($message, $code = 0) { parent::__construct($message, $code); } } class DBEXception_QueryFailed extends DBException{ public function __construct($message, $code = 0) { parent::__construct($message, $code); } } class DBEXception_EmptyResult extends DBException{ public function __construct($message, $code = 0) { parent::__construct($message, $code); } } ?> |
AW: [PHP] Klassenstruktur für Adressdatenbank
Zitat:
Btw, PHP-Klammer bei PHP-Code bitte weglassen, dann funktioniert das Highlighting. :)
PHP-Quellcode:
Und nochmal btw, du brauchst nach der PHP-Klammer nicht einrücken. Damit sparst du wertvollen Platz nach rechts. Und das Einrücken nach der Klammer ist wirklich sinnlos. (Du rückst in Delphi ja auch nicht nach program oder unit ein. (Oder wie auch immer das da oben heißt^^)
class DBEXception_QueryFailed extends DBException
{} Zitat:
Und hier mal eine einfache und ungetestete Implementation der Registry:
PHP-Quellcode:
Liebe Grüße,
// Registry.php
final class Registry { private static $instance = NULL; private $data = array(); private function __construct() {} private function __clone() {} public static function getInstance() { if (NULL === self::$instance) { self::$instance = new self; } return self::$instance; } public function get($id) { return $this->data[$id]; } public function __get($id) { return $this->get($id); } public function set($id, $value) { $this->data[$id] = $value; } public function __set($id, $value) { return $this->set($id, $value); } // TODO throw exception on missing index // TODO unset, __unset, isset, __isset } // Bootloader.php abstract class Bootloader { private static function connect_mysql() { $registry = Registry::getInstance(); $registry->db = new mysqli('127.0.0.1', '', '', 'mysql'); if (mysqli_connect_error()) { die('Connect Error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error()); } printf("Connected to %s\n", $registry->db->host_info); } public static function boot() { register_shutdown_function("Bootloader::shutdown"); self::connect_mysql(); } public static function shutdown() { Registry::getInstance()->db->close(); printf("Connection closed.\n"); } } // index.php Bootloader::boot(); // IrgendeinModel.php class Model { public function __construct() { $this->db = Registry::getInstance()->get('db'); echo $this->db->query('SELECT NOW() AS `now`')->fetch_object()->now . "\n"; } } new Model(); Valentin |
AW: [PHP] Klassenstruktur für Adressdatenbank
Super, das habe ich sogar verstanden. Und in der Registry kann man dann ja alles ablegen, was man zwischen speichern will.
|
AW: [PHP] Klassenstruktur für Adressdatenbank
Richtig, dazu ist es da. :)
Liebe Grüße, Valentin |
AW: [PHP] Klassenstruktur für Adressdatenbank
OK, dann hab eich es verstanden. ;)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz