Anstatt das bereits Gelöste zu lösen, können wir das Problem mithilfe eines vordefinierten Musters implementieren, da wir den großen Vorteil haben, dass es sich um Lösungen handelt, die von anderen Programmierern getestet und dokumentiert wurden.
Oftmals verwenden wir ein Muster, um Software zu programmieren, und wir kennen es aus Unwissenheit nicht, da nicht alle Programmierer wissen, dass es bereits mehrere getestete, funktionsfähige und in seiner Entwicklung einsatzbereite Lösungen gibt.
Arten von Entwurfsmustern pHp
este tipo de patrón permite solo una instancia del objeto o clase, su prioridad es garantizar que solo se invoque una única instancia para una clase. Singleton-Entwurfsmuster: Bei diesem Mustertyp ist nur eine Instanz des Objekts oder der Klasse zulässig. Die Priorität besteht darin, sicherzustellen, dass für eine Klasse nur eine einzige Instanz aufgerufen wird. Wir sehen ein Beispiel für die Anwendung dieses Musters im pHp-Code
<? php Klasse Patronsingleton { private statische $ Instanz; private $ count; private Funktion __construct () { echo "Wir erstellen eine Instanz von". __CLASS__. " n"; $ this-> count = 0; } public static function invokeinstance () { if (! self :: $ instanceof self) { self :: $ instance = new self; } return self :: $ instance; } öffentliche Funktion sumar () { return ++ $ this-> count; } öffentliche Funktion subtrahieren () { return - $ this-> count; } } ?>
Versuchen wir, die Klasse zu implementieren, um das Ergebnis zu sehen
<? php $ berechnung = patronsingleton :: invokeinstance (); echo "Summon add:". $ berechnung-> add (). " n"; Echo "Summe Summe". $ Berechnung-> add (). " n"; echo "Subtraktion aufrufen:". $ berechnung-> subtrahieren (). " n"; echo "Subtraktion aufrufen". $ berechnung-> subtrahieren (). " n"; ?>
Da die Parameter der Klasse eine private Sichtbarkeit haben und wir daher den Konstruktor der Klasse nicht aufrufen oder ändern können, können wir nur auf die Funktion invokeinstance () zugreifen, sodass wir die Daten der Klasse mit Ausnahme von nicht ändern können Damit können wir die aufgerufene Funktion ausführen. Die Klasse wird nur einmal instanziiert.
Strategie-Entwurfsmuster
Das Strategiedesignmuster hat mit Schnittstellen und Polymorphismus zu tun. Ziel ist es, mehrere Lösungen zu erstellen und dann die zu implementieren, die zu uns passt, je nachdem, was wir benötigen. Angenommen, wir haben eine Anwendung, die Berichte in Excel oder PDF ausgeben soll. Dies wird beispielsweise in den Prestashop-Cms verwendet.
Sehen wir uns ein Beispiel für ein Strategietyp-Entwurfsmuster an, um mehrere Berichte zu generieren:
Schnittstellenberichte { Funktion generiere Bericht (); } Klasse InformePDF implementiert Reports { private $ dbdatosinforme; Funktion __construct ($ dbdatosinforme) { $ this-> data_report = $ dbdatos_report; } Funktion generateinforme () { // Hier ist der Code zum Generieren des Bericht-PDFs mit den Daten der Matrix $ dbdatosinforme, die von einer Abfrage in die Datenbank übernommen wurden // } } Klasse InformeExcel implementiert Reports { private $ dbdatosinforme; Funktion __construct ($ dbdatosinforme) { $ this-> data_report = $ dbdatos_report; } public function generateinfrome () { // Hier wird der Code zum Generieren des Berichts verwendet, der eine Excel-Datei mit den Daten der Matrix $ dbdatosinforme erstellt, die von einer Abfrage in die Datenbank übernommen wurden // }
Jetzt müssen wir die Schnittstelle und den Polymorphismus in einer Klasse implementieren
Klassenberichte { private $ patternstrategie; private $ dbdatosinforme; Funktion __construct ($ dbdatosinforme) { $ this-> data_report = $ dbdatos_report; } Funktion asignpatron (Reports Patron $) { $ this-> patronstrategie = $ patron; } Funktion crearinforme () { $ this-> patronestrategia-> generatereport (); } }
Schließlich implementieren wir die Klasse, die die Schnittstelle in der von uns entwickelten Anwendung verbirgt
<? $ dbdatosinforme = array (); $ data = rsconsultasql; $ report = new Reports (); If ($ tipo_report = "pdf") { $ report-> assignpatron (neues ReportPDF ($ data)); $ report-> create report (); } If ($ tipo_reforme = "excel") { $ report-> assignpatron (neues InformeExcel ($ data)); $ report-> create report (); }
So können wir sehen, wie wir mit zwei verschiedenen Strategien das Problem gelöst haben, zwei völlig unterschiedliche Berichte zu erstellen, die wir dann entsprechend unseren Anforderungen oder Bedürfnissen verwenden können, und der Code kann in anderen von uns entwickelten Anwendungen wiederverwendet werden.
MVC-Entwurfsmuster
Ein bekanntes Entwurfsmuster innerhalb des Webdesigns ist das MVC-Muster (Modell, Ansicht, Steuerung). Das Model-View-Controller-Muster für das Design von Webanwendungen ist ein Standard, der häufig von Frameworks wie Zend, Codeigniter, Yii, Cakephp und anderen verwendet wird. Das Hauptziel dieses Musters ist es, eine Architektur in drei Schichten für unsere Entwicklung bereitzustellen, das Modell, die Ansicht und den Controller. In einigen Fällen wird es mithilfe des HMVC-Musters erweitert, wodurch dieses Muster um das Merkmal der hierarchischen oder modularen Verwaltung von Ebenen erweitert wird.
Das Modell ist für die Verwaltung der Daten verantwortlich und fragt die Datenquelle ab, unabhängig davon, ob es sich um eine Datenbank oder eine Datendatei handelt. Nur der Controller kann mit dem Modell und über eine Funktion interagieren, die Daten zurückgibt oder aufnimmt, aber das Verhalten des Modells nicht ändern kann.
Das Vista präsentiert die Informationen auf dem Bildschirm und ist das Design des Webs. Sie können nur den Controller kontaktieren und die Daten anzeigen, die ich ihm gesendet habe, damit das Web angezeigt werden kann. Der Controller ist verantwortlich für das Senden von Anfragen an das Modell und das Empfangen der Daten, das Verarbeiten des Ergebnisses, falls erforderlich, und das Senden der Antwort an die auf dem Bildschirm anzuzeigende Ansicht.
Beispiel eines MVC-Musters
Wir haben das Beispieldatenmodell basierend auf dem Codeingiter-Framework erstellt
<? php Klasse Alumnosmodel erweitert Model { function alumnosdb () { // Das Modell starten parent :: Model (); } function consultaralumnos () { // wir suchen alle studenten des instituts in der tabelle studenten $ data ['result'] = $ this-> db-> get ('students'); // Das Ergebnis der Abfrage zurückgeben return $ data ['result']; }} ?>
Wir erstellen den Controller, um mit der Ansicht und mit dem Modell kommunizieren zu können
<? php Klasse Alumnoscontroller erweitert Controller { Funktion Students () { // Wir haben den Controller gestartet parent :: Controller (); // Wir fügen das zu verwendende Modell hinzu $ this-> load-> model (Studentsmodel '); // Wir fügen das Plugin hinzu, das wir zum Verwalten von Datenbanken benötigen $ this-> load-> database (); } // Wir erstellen die Funktion, die das Modell konsultiert und die Daten an die Ansicht sendet function mostraralumnos () { $ data [titulopagina] = Liste der Schüler; // Überprüfen Sie das Modell $ data ['result'] = $ this-> Studentsmodel-> studentplanners (); // Sende das Ergebnis der Abfrage an die Ansicht $ this-> load-> view ('Studentenliste, $ data); } } ?>
Schließlich erstellen wir die Ansicht, die vom Controller aufgerufen wird und listanumnos.php heißt und den folgenden Code in HTML enthält
<html> <head> <title> <? = $ titulopagina;?> </ title> </ head> <body> <h1> <? = $ titulopagina;?> </ h1> <table border = '1'> <tr> <th> Titel </ th> <td> Eintrag </ td> </ tr> <? php foreach ($ result-> result_array () als $ student):?> <tr> <th> <? = $ student ['name'];?> </ th> <td> <? = $ student ['phone'];?> </ td> </ tr> <? php endforeach;?> </ table> </ body> </ html>
Wie wir sehen können, ist der Model View Controller (MVC) sehr benutzerfreundlich und sehr nützlich für die Softwareentwicklung, da er Daten von der Datenbank, dem Anwendungsdesign und der Programmierlogik in drei verschiedenen Komponenten trennt, einschließlich Es kann von verschiedenen Personen oder Teams entwickelt werden.
Ein Vorteil des MVC-Musters besteht darin, dass ein Datenbankadministrator Modellabfragen, einen Controller-Programmierer und eine Webdesigner-Ansicht erstellen kann, ohne auf Funktionen zuzugreifen, die diesen nicht entsprechen.
Das MVC-Muster Alle Controller befinden sich in demselben Verzeichnis, alle Ansichten in einem Verzeichnis und dasselbe Modell. In dem HMVC-Muster sind sie nach Modulen getrennt. Jedes Verzeichnis ist ein Modul. Beispielsweise hat das Kundenmodul seinen Treiber, sein Modell und seine Ansicht Das Verkaufsmodul verfügt über eine eigene MVC in einem separaten Verkaufsverzeichnis.