


Verstehen Sie das Proxy-Muster von PHP-Entwurfsmustern in einem Artikel
Das Proxy-Muster ist ein strukturelles Entwurfsmuster, das auf die klassische Struktur abzielt, in der Klassen und Objekte kombiniert werden. Das Proxy-Muster ist ebenfalls ein häufig verwendetes Entwurfsmuster, auf das wir uns konzentrieren müssen. Es kann einige zusätzliche Funktionen hinzufügen, ohne das Zielobjekt zu ändern.
Definition
Proxy-Muster (Proxy) stellt einen Proxy für andere Objekte bereit, um den Zugriff auf dieses Objekt zu steuern. Verwenden Sie das Proxy-Muster, um ein Proxy-Objekt zu erstellen. Lassen Sie das Proxy-Objekt den Zugriff auf das Zielobjekt steuern (das Zielobjekt kann ein Remote-Objekt, ein Objekt sein, dessen Erstellung teuer ist, oder ein Objekt, das eine Sicherheitskontrolle erfordert). Fügen Sie einige Extras hinzu, ohne die Zielfunktion zu ändern.
Frage
Derzeit verfügt das System über eine Login-Klasse für Benutzeranmeldungs- und Registrierungsgeschäfte. Der Pseudocode lautet wie folgt:
class UserLogin { // …… 省略属性和部分方法 public function login ($name, $pass) { // 登录业务 } public function reg ($name, $pass) { // 注册业务 } }
Jetzt möchten wir dem Benutzeranmelde- und Registrierungsgeschäft eine Funktion hinzufügen – Strombegrenzung, die die Häufigkeit, mit der der Client diese Methode aufruft, auf maximal 5 Mal pro Sekunde begrenzt . Nun implementieren wir diese Funktion wie folgt:
class UserLogin { // …… 省略属性和部分方法 public function login ($name, $pass) { // 限流 $limit = new Limit(); if ($limit->restrict()) { // …… } // 登录业务 } public function reg ($name, $pass) { // 限流 $limit = new Limit(); if ($limit->restrict()) { // …… } // 注册业务 } }
Schauen Sie sich den obigen Code an. Erstens dringt der aktuelle Begrenzungscode in den Geschäftscode ein Geschäftscode. Zweitens hat die Strombegrenzung nichts mit dem Geschäftskodex zu tun und verstößt gegen das Prinzip der Einzelverantwortung.
Implementierung
Als nächstes schreiben wir den obigen Code im Proxy-Modus neu. Der neu geschriebene Code sieht so aus:
interface IUserLogin { function login (); function register (); } class UserLogin implements IUserLogin { // …… 省略属性和部分方法 public function reg ($uname, $pass) { // 注册业务 } public function login ($uname, $pass) { // 登录业务 } } class UserLoginProxy implements IUserLogin { private $limit = null; private $login = null; public function __construct(Limit $limit, Login $login) { $this->limit = $limit; $this->login = $login; } public function login($uname, $pass) { if ($this->limit->restrict()) { // ... } return $this->login->login($uname, $pass); } public function register($uname, $pass) { if ($this->limit->restrict()) { // ... } return $this->login->register($uname, $pass); } }
Die obige Methode basiert auf der Designidee der Schnittstelle und nicht auf der Implementierungsprogrammierung. Wenn die ursprüngliche Klasse jedoch keine Schnittstelle definiert oder diese Klasse nicht von uns entwickelt und verwaltet wird, wie implementiert man dann den Proxy-Modus?
Für die Erweiterung dieser externen Klasse verwenden wir im Allgemeinen die Vererbung.
class UserLogin { public function reg ($uname, $pass) { // 注册业务 } public function login ($uname, $pass) { // 登录业务 } } class UserLoginProxy extends Login { private $limit = null; public function __construct(Limit $limit, Login $login) { $this->limit = $limit; $this->login = $login; } public function login($uname, $pass) { if ($this->limit->restrict()) { // ... } return parent::login($uname, $pass); } public function reg($uname, $pass) { if ($this->limit->restrict()) { // ... } return parent::register($uname, $pass); } }
Sehen Sie sich den obigen Code an. Sie werden feststellen, dass der ähnliche Code
if ($this->limit->restrict()) { // ... }
zweimal vorkommt. Jetzt fügen wir einfach die aktuelle Begrenzungsfunktion zu zwei Methoden hinzu. Wenn die UserLogin-Klasse 10 Methoden hat und wir die aktuelle Begrenzungsfunktion zu jeder Methode hinzufügen möchten, müssen wir diesen Code zehnmal kopieren. Wenn wir allen Methoden in 10 Klassen eine Strombegrenzungsfunktion hinzufügen möchten und jede Klasse über 10 Methoden verfügt, wird der obige Strombegrenzungscode 100 Mal wiederholt.
Natürlich werden Sie sagen, dass ich den aktuellen Begrenzungscode in eine Funktion kapseln kann, um das obige Problem zu lösen? Es gibt jedoch immer noch ein Problem, das nicht gelöst werden kann. Jede Methode in der ursprünglichen Klasse muss in der Proxy-Klasse erneut implementiert werden. So wie es in der oben genannten Originalklasse reg- und login-Methoden gibt, gibt es auch in der Proxy-Klasse reg- und login-Methoden.
Dynamischer Proxy
Um die oben genannten Probleme zu lösen, können wir einen dynamischen Proxy verwenden, um es zu lösen. Wenn Sie einen dynamischen Proxy verwenden möchten, müssen Sie den Reflexionsmechanismus in PHP verstehen und verwenden.
php verfügt über eine vollständige Reflexions-API, die die Möglichkeit bietet, Klassen, Schnittstellen, Funktionen, Methoden und Erweiterungen zurückzuentwickeln. Darüber hinaus stellt die Reflection-API Methoden zum Extrahieren von Dokumentationskommentaren aus Funktionen, Klassen und Methoden bereit. Auf die Kenntnisse im Zusammenhang mit der PHP-Reflexion werde ich hier nicht näher eingehen. Sie können die relevanten Informationen selbst überprüfen.
Beachten Sie, dass die Verwendung von Reflektion viel Leistung verbraucht. Verwenden Sie sie daher bitte nicht unter normalen Umständen.
Lassen Sie uns zeigen, wie Sie mithilfe von Reflection einen dynamischen Proxy implementieren. Der Pseudocode lautet wie folgt:
class UserLogin { public function reg ($uname, $pass) { // 注册业务 echo '注册业务' . PHP_EOL; } public function login ($uname, $pass) { // 登录业务 echo '登录业务' . PHP_EOL; } } class LimitProxy { // 用来保存多个实例对象 private $target = []; public function __construct(Object $obj) { $this->target[] = $obj; } public function __call($name, $arguments) { foreach ($this->target as $obj) { $ref = new \ReflectionClass($obj); if ($method = $ref->getMethod($name)) { if ($method->isPublic() && !$method->isAbstract()) { // 限流 echo "这里是限流业务处理" . PHP_EOL; $result = $method->isStatic() ? $method->invoke(null, $obj, ...$arguments) : $method->invoke($obj, ...$arguments); return $result; } } } } }
Der Testcode lautet wie folgt:
$login = new Login(); $loginProxy = new LimitProxy($login); $loginProxy->reg('gwx', '111111'); $loginProxy->login('james', '111111111');
Anwendungsszenario
Zugangskontrolle (Schutzmittel). Das System verfügt beispielsweise über ein Bestellmodul. Ursprünglich verfügte dieses Modul auch über eine Berechtigungskontrolle, aber jetzt möchten wir, dass es nur für Clients mit bestimmten IP-Adressen zugänglich ist. Dann können wir den Proxy-Modus verwenden.
Die lokale Ausführung von Remote-Diensten (Remote-Proxy) eignet sich für Situationen, in denen sich das Dienstobjekt auf einem Remote-Server befindet.
Entwickeln Sie einige nicht funktionale Anforderungen im Geschäftscode, z. B.: Strombegrenzung, Statistiken, Protokollierung
Caching-Anwendungen, zum Beispiel hinzufügen ein Cache-Proxy, wenn der Cache vorhanden ist, wird der Cache-Proxy aufgerufen, um die zwischengespeicherten Daten abzurufen. Wenn der Cache nicht vorhanden ist, wird die ursprüngliche Schnittstelle aufgerufen.
Das obige ist der detaillierte Inhalt vonVerstehen Sie das Proxy-Muster von PHP-Entwurfsmustern in einem Artikel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Viele Benutzer von Windows 11 haben berichtet, dass beim Systemstart oder beim Versuch, Befehle über die Eingabeaufforderung auszuführen, die Fehlermeldung „Fehler beim Schreiben der Proxy-Einstellungen – Zugriff verweigert“ angezeigt wird. Normalerweise tritt dieser Fehler auf, wenn versucht wird, einen Befehl auszuführen, oder nach einem Upgrade auf das Windows-Betriebssystem. Einige nicht ordnungsgemäß installierte Anwendungen von Drittanbietern können die Eingabeaufforderung stören. Stört Sie dieser Fehler beim Schreiben der Proxy-Einstellungsmeldung auf Ihrem Windows 11-Computer? Dann sind Sie bei uns genau richtig. In diesem Artikel haben wir einige mögliche Lösungen zusammengestellt, die Ihnen bei der Lösung dieses Problems auf Ihrem Computer helfen können. Fix 1 – Ändern Sie die Standard-Terminalanwendung von Windows. Beginnen Sie mit Windows

Das Proxy-Muster ist ein Java-Framework-Entwurfsmuster, das durch die Erstellung eines Proxy-Objekts zwischen dem Client und dem Zielobjekt vermittelt. Zu seinen Vorteilen gehören: Schutz von Zielobjekten, Bereitstellung von Datenintegrität und -sicherheit, Implementierung von Berechtigungskontrollen und Sicherheitsmaßnahmen, Hinzufügen zusätzlicher Funktionen wie Protokollierung, Caching und Transaktionsverwaltung; Ziele. Das Proxy-Muster hat jedoch auch Nachteile: Overhead: Das Erstellen und Verwalten von Proxy-Objekten kann die Leistung beeinträchtigen. Komplexität: Erfordert ein umfassendes Verständnis des Entwurfsmusters, was in einigen Fällen möglicherweise nicht angemessen ist.

Einführung PHP-Entwurfsmuster sind eine Reihe bewährter Lösungen für häufige Herausforderungen in der Softwareentwicklung. Durch Befolgen dieser Muster können Entwickler eleganten, robusten und wartbaren Code erstellen. Sie unterstützen Entwickler bei der Einhaltung der SOLID-Prinzipien (Single Responsibility, Open-Closed, Liskov Replacement, Interface Isolation und Dependency Inversion) und verbessern so die Lesbarkeit, Wartbarkeit und Skalierbarkeit des Codes. Arten von Designmustern Es gibt viele verschiedene Designmuster, jedes mit seinem eigenen einzigartigen Zweck und seinen eigenen Vorteilen. Hier sind einige der am häufigsten verwendeten PHP-Entwurfsmuster: Singleton-Muster: Stellt sicher, dass eine Klasse nur eine Instanz hat und bietet eine Möglichkeit, global auf diese Instanz zuzugreifen. Factory-Muster: Erstellt ein Objekt, ohne seine genaue Klasse anzugeben. Es ermöglicht Entwicklern dies unter bestimmten Bedingungen

PHP ist eine weit verbreitete und sehr beliebte Programmiersprache. PHP ist ein sehr wichtiger Bestandteil heutiger Webanwendungen. Bei der Entwicklung von PHP-Anwendungen spielen Designmuster eine entscheidende Rolle. Entwurfsmuster sind eine Vorlage zur Lösung von Problemen, die in verschiedenen Umgebungen wiederverwendet werden kann. Sie helfen uns, besseren Code zu schreiben und den Code zuverlässiger, wartbarer und skalierbarer zu machen. In diesem Artikel werden wir einige häufig verwendete Entwurfsmuster in PHP und deren Implementierung untersuchen. Singleton-Muster Das Singleton-Muster ist ein Erstellungsmuster, das dies ermöglicht

Proxy-Muster in Java Proxy ist ein Entwurfsmuster, das es einem Objekt ermöglicht, in Form eines anderen Objekts zu erscheinen und über das Proxy-Objekt auf das ursprüngliche Objekt zuzugreifen. Proxys werden in vielen Anwendungen häufig verwendet. Die häufigste davon ist die Implementierung von Remote-Objektaufrufen und der Protokollierung im Netzwerk. Auch in Java gibt es viele Beispiele für die Verwendung des Proxy-Musters. Das Proxy-Muster in Java wird hauptsächlich auf die folgenden drei Arten implementiert: Statischer Proxy. Statischer Proxy wird durch Erstellen einer Proxy-Klasse während der Kompilierungsphase implementiert. Proxy-Klasse und ursprüngliche Klassenimplementierung

Zu den PHP-Entwurfsmustern gehören: 1. Singleton-Modus, der sicherstellt, dass eine Klasse nur ein instanziiertes Objekt hat. 2. Factory-Modus, der den Instanziierungsprozess des Objekts in einer Factory-Klasse kapselt. 3. Abstrakter Factory-Modus, der a ähnelt Fabrikmuster zum Erstellen von Objekten; 4. Beobachtermuster, das Eins-zu-Viele-Abhängigkeiten zwischen Objekten realisiert; 5. Adaptermuster, das die Schnittstelle einer Klasse in die Schnittstelle einer anderen Klasse umwandelt; 6. Dekoratormuster, das dynamisch einige zusätzliche Funktionen hinzufügt; ein Objekt; 7. Iteratormuster; 9. Vorlagenmethodenmuster usw.

Mit der kontinuierlichen Weiterentwicklung der Technologie werden Entwurfsmuster in der Softwareentwicklung immer wichtiger. Als neueste PHP-Version integriert PHP7.0 auch viele Designmuster. In diesem Artikel werden wir die Entwurfsmuster in PHP7.0 untersuchen, um PHP-Programmierern zu helfen, diese Muster besser zu verstehen und anzuwenden. Singleton-Muster Das Singleton-Muster ist ein Erstellungsmuster, das sicherstellt, dass eine Klasse nur eine Instanz hat und einen globalen Zugriffspunkt bereitstellt. In PHP7.0 können Sie dazu die __construct-Methode und die statische Methode verwenden

Einführung in PHP-Kernentwurfsmuster und -praktiken: Entwurfsmuster sind häufig verwendete Problemlösungsvorlagen in der Softwareentwicklung. Sie bieten eine wiederverwendbare Lösung, die uns dabei helfen kann, während des Entwicklungsprozesses Best Practices und gute Softwaredesignprinzipien einzuhalten. Als weit verbreitete Programmiersprache verfügt PHP auch über viele gängige und nützliche Designmuster, die in der Kernentwicklung verwendet werden können. In diesem Artikel werden mehrere gängige PHP-Entwurfsmuster vorgestellt und relevante Codebeispiele bereitgestellt. 1. Singleton-Modus (Singleton) Der Singleton-Modus ist ein Typ, der nur zulässt
