Lassen Sie uns zunächst einige Konzepte zitieren:
Factory-Muster: Definieren Sie speziell eine Klasse, die für die Erstellung von Instanzen anderer Klassen verantwortlich ist. Die erstellten Instanzen haben normalerweise dieselbe übergeordnete Klasse. Das Factory-Muster ist ein Klassenerstellungsmuster, das normalerweise Instanzen verschiedener Klassen basierend auf verschiedenen unabhängigen Variablen zurückgibt.
Der Kern des Factory-Musters besteht darin, dass eine Factory-Klasse anhand der eingehenden Parameter dynamisch bestimmt, welche Produktinstanz erstellt werden soll. Das Fabrikmuster umfasst Fabrikrollen, abstrakte Produktrollen und spezifische Produktrollen.
Factory-Rolle (Ersteller): Sie ist der Kern des Factory-Musters. Sie ist für die Implementierung der internen Logik der Erstellung aller Instanzen verantwortlich. Die Factory-Klasse kann direkt von der Außenwelt aufgerufen werden, um die erforderlichen Produktobjekte zu erstellen.
Abstrakte Produktrolle (Produktrolle): Es ist die übergeordnete Klasse aller durch das Factory-Muster erstellten Objekte. Sie ist für die Beschreibung der öffentlichen Schnittstelle verantwortlich, die allen Instanzen gemeinsam ist.
Konkrete Produktrolle: Es ist das Erstellungsziel des Factory-Musters. Alle Objekte sind Instanzen einer bestimmten Klasse, die diese Rolle spielt.
zend_db in ZF ist ein gutes Beispiel für ein Fabrikmuster.
Als nächstes beginnt die Analyse. . . . . .
Bei der Konfiguration von zf können wir die Informationen zum Datenbankverbindungsvorgang in die Datei Bootstrap.php einfügen
<?php class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { function __construct($app){ parent::__construct($app); $url=constant('APPLICATION_PATH').DIRECTORY_SEPARATOR.'configs'.DIRECTORY_SEPARATOR.'config.ini'; $dbconfig=new Zend_Config_Ini($url,null,true); $db=Zend_Db::factory($dbconfig->general->db->adapter,$dbconfig->general->db->params->toArray()); // var_dump($db); $db->query('SET NAMES UTF8'); Zend_Db_Table::setDefaultAdapter($db); } } ?>
Rufen Sie in der Eintragsdatei bootstrap() über ein Zend_Application-Objekt auf, ähnlich wie Bootstrap Der Konstruktor wird aufgerufen werden.
Im Konstruktor können wir über Zend_Db::factory() eine Objektinstanz zum Betreiben der Datenbank erhalten.
Lesen Sie die relevanten Informationen in config.ini über eine Zend_Config_Ini-Instanz und übergeben Sie sie als Parameter an die Factory-Funktion Zend_Db::factory()
Configuration.ini-Informationen
[general]
db.adapter =PDO_MYSQL
db.params.host =localhost
db.params.username =root
db.params.password =
db.params.dbname = Datenbankname
Zend_Db::factory( )
Parameter eins: Gibt den zu bedienenden Datenbanktyp an, z. B. PDO_MYSQL
Parameter zwei: Gibt die Informationen zum Herstellen einer Verbindung zur Datenbank an, einschließlich Servername, Benutzername, Kennwort und der zu verbindenden Datenbank
Werfen Sie zuerst zwei Fragen aus:
①Wenn die Datenbank, die wir betreiben möchten, MSSQL ist, was sollen wir tun?
②Hier verwenden wir Zend_Db::factory() Sollten wir das tun?
Antwort:
① Wir müssen nur PDO_MYSQL in PDO_MSSQL in der config.ini-Datei ändern
② Erstellen Sie eine Objektinstanz für den Betrieb der Datenbank auf herkömmliche Weise:
$db=new Zend_Db_Adapter_Pdo_Mysql($ config)
Unter anderem: $config-Informationen werden aus config.ini gelesen
Das Problem ist: Wenn wir die traditionelle Methode zum Erstellen einer Objektinstanz verwenden, müssen wir einen Prozess bestimmen die Art der zu betreibenden Datenbank?
Zum Beispiel:
switch ($dbType){ case 'PDO_MYSQL': .... case 'PDO_MSSQL': .... case 'PDO_SQLITE': .... }
Wir müssen unterschiedliche Anweisungen schreiben, um die Datenbank entsprechend verschiedenen Datenbanktypen zu betreiben.
Ist das jedoch nicht sehr mühsam? Der Werksmodus wurde für uns erstellt und ist sehr bequem zu verwenden.
Wie implementiert man den Werksmodus in Zf?
Zunächst muss es eine abstrakte Basisklasse geben: Zend_Db_Adapter_Abstract. Diese Klasse ist die übergeordnete Klasse aller vom Factory-Muster erstellten Objekte. Sie ist für die Bereitstellung der allen Instanzen gemeinsamen Schnittstelle verantwortlich.
Diese Klasse bietet nicht nur einige Implementierungsmethoden, mit denen wir beim Betrieb von Datenbanken bestens vertraut sind, wie zum Beispiel: Auswählen, Aktualisieren, Einfügen, Löschen, Abfragen, FetchRow, FetchAssoc, sondern auch einige Schnittstellen für die Implementierung in Unterklassen. wie zum Beispiel: limit, getServerVersion, closeConnection, beschreibenTable usw.
abstract class Zend_Db_Adapter_Abstract { //.. } abstract class Zend_Db_Adapter_Pdo_Abstract extends Zend_Db_Adapter_Abstract { //.. } class Zend_Db_Adapter_Pdo_Mysql extends Zend_Db_Adapter_Pdo_Abstract { //...实现针对Mysql数据库的操作 } class Zend_Db_Adapter_Pdo_Mssql extends Zend_Db_Adapter_Pdo_Abstract { //....实现针对Mssql数据库的操作 } class Zend_Db_Adapter_Pdo_Sqlite extends Zend_Db_Adapter_Pdo_Abstract { //....实现针对Sqlite数据库的操作 }
Die obige Beziehung kann einfach mit einem Bild ausgedrückt werden
Als nächstes wollen wir Verfolgen Sie, wie Zend_Db::Factory() verschiedene Datenbanken basierend auf verschiedenen Parametern auswählt.
Weitere Artikel über die Anwendung von Factory-Mustern im Zend Framework finden Sie auf der chinesischen PHP-Website!