1. Was ist das Singleton-Muster?
1. Bedeutung
Als Objekterstellungsmodus stellt der Singleton-Modus sicher, dass es nur eine Instanz einer bestimmten Klasse gibt, und er instanziiert sich selbst und stellt diese Instanz global dem gesamten System zur Verfügung. Es wird keine Kopie der Instanz erstellt, sondern eine Referenz auf die in der Singleton-Klasse gespeicherte Instanz zurückgegeben.
Drei Schlüsselpunkte des Singleton-Musters:
(1) Eine statische Mitgliedsvariable ist erforderlich, um die einzige Instanz der Klasse zu speichern:
private static $_instance;
(2) Konstruktoren und Klonfunktionen müssen als privat deklariert werden, um zu verhindern, dass externe Programme neue Klassen erstellen und dadurch die Bedeutung des Singleton-Modus verlieren:
private function __construct() { $this->_db = pg_connect('xxxx'); } private function __clone() { }//覆盖__clone()方法,禁止克隆
(3). Für den Zugriff auf diese Instanz muss eine öffentliche statische Methode (normalerweise die getInstance-Methode) bereitgestellt werden, wodurch ein Verweis auf die eindeutige Instanz zurückgegeben wird
public static function getInstance() { if(! (self::$_instance instanceof self) ) { self::$_instance = new self(); } return self::$_instance; }
2, Warum den Singleton-Modus verwenden?
Die meisten Leute verstehen den Zweck des Singleton-Musters aus seiner wörtlichen Bedeutung und denken, dass es Systemressourcen spart, wiederholte Instanziierung vermeidet und eine Art „Familienplanung“ darstellt. Und jedes Mal, wenn die Seite ausgeführt wird, Alle Ressourcen werden aus dem Speicher gelöscht. Daher muss der Singleton in PHP bei jeder Ausführung neu instanziiert werden, wodurch die Bedeutung einer wiederholten Instanziierung des Singletons verloren geht. In dieser Hinsicht ist der Singleton in PHP tatsächlich so etwas enttäuschend. Aber hat ein Singleton nur diese Funktion und Anwendung?
Die Anwendung von PHP findet hauptsächlich in Datenbankanwendungen statt, daher gibt es in einer Anwendung eine große Anzahl von Datenbankoperationen. Wenn Sie den Singleton-Modus verwenden, ist die Entwicklung objektorientiert kann eine große Anzahl neuer Ressourcen vermieden werden.
Wenn eine Klasse benötigt wird, um bestimmte Konfigurationsinformationen im System global zu steuern, kann sie einfach im Singleton-Modus implementiert werden. Weitere Informationen finden Sie im FrontController-Teil von zend Framework.
In einer Seitenanforderung ist das Debuggen einfach, da der gesamte Code (z. B. die Datenbankoperationsklasse db) in einer Klasse konzentriert ist. Wir können Hooks in der Klasse setzen und Protokolle ausgeben, um var_dump und echo überall zu vermeiden. 1. Nachteile von PHP:
PHP ist eine interpretierte Skriptsprache. Dieser Betriebsmechanismus führt dazu, dass alle zugehörigen Ressourcen nach der Interpretation und Ausführung jeder PHP-Seite recycelt werden. Mit anderen Worten: PHP hat keine Möglichkeit, ein Objekt auf Sprachebene im Speicher zu speichern. Dies unterscheidet sich von kompilierten Typen wie asp.net und Java. In Java existiert beispielsweise immer ein Singleton Die Variablen sind seitenübergreifend und können diese Instanz im Anwendungslebenszyklus wirklich einzigartig machen. Allerdings sind in PHP alle Variablen, egal ob es sich um globale Variablen oder statische Mitglieder der Klasse handelt, auf Seitenebene. Jedes Mal, wenn die Seite ausgeführt wird, wird ein neues Objekt neu erstellt und nach der Ausführung der Seite gelöscht. Es scheint, dass PHP Der Singleton-Modus ist bedeutungslos, daher denke ich, dass der PHP-Singleton-Modus nur dann sehr sinnvoll ist, wenn mehrere Anwendungsszenarien in einer einzelnen Anforderung auf Seitenebene auftreten und dieselbe Objektressource gemeinsam nutzen müssen.
2. Anwendungsfälle des Singleton-Modus in PHP:
(1) Interaktion zwischen Anwendung und Datenbank
In einer Anwendung wird es eine große Anzahl von Datenbankoperationen geben, z as Um über ein Datenbankhandle eine Verbindung zur Datenbank herzustellen, kann durch die Verwendung des Singleton-Modus eine große Anzahl neuer Vorgänge vermieden werden, da jeder neue Vorgang Speicherressourcen und Systemressourcen verbraucht.
(2) Konfigurationsinformationen steuern
Wenn eine Klasse benötigt wird, um bestimmte Konfigurationsinformationen im System global zu steuern, kann sie einfach mithilfe des Singleton-Modus implementiert werden.
3. Wie implementiert man den Singleton-Modus?
1. Häufige Beispiele für den Datenbankzugriff:
|
|||||
/** * MyPDO */ class MyPDO { protected static $_instance = null; protected $dbName = ''; protected $dsn; protected $dbh;
/** * 构造 * * @return MyPDO */ private function __construct($dbHost, $dbUser, $dbPasswd, $dbName, $dbCharset) { try { $this->dsn = 'mysql:host='.$dbHost.';dbname='.$dbName; $this->dbh = new PDO($this->dsn, $dbUser, $dbPasswd); $this->dbh->exec('SET character_set_connection='.$dbCharset.', character_set_results='.$dbCharset.', character_set_client=binary'); } catch (PDOException $e) { $this->outputError($e->getMessage()); } }
/** * 防止克隆 * */ private function __clone() {}
/** * Singleton instance * * @return Object */ public static function getInstance($dbHost, $dbUser, $dbPasswd, $dbName, $dbCharset) { if (self::$_instance === null) { self::$_instance = new self($dbHost, $dbUser, $dbPasswd, $dbName, $dbCharset); } return self::$_instance; }
/** * Query 查询 * * @param String $strSql SQL语句 *@param String $ queryMode 查询 方式 (alle oder zeile) *@param boolean $ debug *@return Array */
public function query($strSql, $queryMode = 'All', $debug = false) { if ($debug === true) $this->debug( $strSql); $recordset = $this->dbh->query($strSql); $this->getPDOError(); if ($recordset) { $recordset->setFetchMode(PDO::FETCH_ASSOC); if ($queryMode == 'All') { $result = $recordset->fetchAll() > & 🎜> }
/** * Update Update * * @param String $table Tabellenname * @param Array $arrayDataValue Felder und Werte * @param String $where Bedingung * @param Boolean $debug * @return Int */ public function update($table, $arrayDataValue, $where = '', $debug = false) { $this->checkFields($table, $arrayDataValue); if ($where) { $strSql = ''; foreach ($arrayDataValue as $key => $value) { $strSql .= ", `$key`='$value'"; } $ strSql = substr($strSql, 1); $strSql = "UPDATE `$table` SET $strSql WHERE $where"; } else { $strSql = "REPLACE INTO `$table` (`".implode('`,`', array_keys ($arrayDataValue))."`) VALUES ('".implode("','", $arrayDataValue)."')"; } if ($debug == = true) $this->debug($strSql); $result = $this->dbh->exec($strSql); $this->getPDOError (); return $result; }
/** * Einfügen einfügen * * @param String $table Tabellenname * @param Array $arrayDataValue Felder und Werte * @param Boolean $debug * @return Int */ public function insert($table, $arrayDataValue, $debug = false) { $this-> checkFields($table, $arrayDataValue); $strSql = "INSERT INTO `$table` (`".implode('`,`', array_keys($arrayDataValue))."`) VALUES (' ".implode("','", $arrayDataValue)."')"; if ($debug === true) $this->debug($strSql); $result = $this->dbh->exec($strSql); $this->getPDOError(); return $result; }
/** * Überschreibmodus ersetzen, um * * @param String $table Tabellenname * @param Array $arrayDataValue Felder und Werte * @param Boolean $debug * @return Int*/ public function replace($table, $arrayDataValue, $debug = false) { $this->checkFields($table, $arrayDataValue); $strSql = "REPLACE INTO `$table`(`".implode('`,`', array_keys($ arrayDataValue))."`) VALUES ('".implode("','", $arrayDataValue)."')"; if ($debug === true) $this->debug ($strSql); $result = $this->dbh->exec($strSql); $this->getPDOError(); return $result; } /** * Löschen Löschen * * @param String $table Tabellenname * @param String $where Bedingung * @param Boolean $debug * @return Int*/ public function delete($table, $where = '', $debug = false) { if ($where == '') { $this->outputError("'WHERE' is Null"); } else { $strSql = "DELETE FROM `$table` WHERE $where"; if ($debug === true) $this-> debug($strSql); $result = $this->dbh->exec($strSql); $this->getPDOError(); return $result; 句 ** @param String $strSql * @param Boolean $debug * @return Int */ public function execSql ($ strSql, $debug = false) { if ($debug === true) $this->debug($strSql); $result = $ this->dbh->exec($strSql); $this->getPDOError(); return $result; }
/** * Maximalwert des Feldes abrufen * 🎜> * @param string $where Bedingung */ public function getMaxValue($table, $field_name, $where = '', $debug = false) { $strSql = "SELECT MAX(".$field_name.") AS MAX_VALUE FROM $table"; if ($where != '') $strSql .= " WHERE $where "; if ($debug === true) $this->debug($strSql); $arrTemp = $this->query($strSql, 'Row' ); $maxValue = $arrTemp["MAX_VALUE"]; if ($maxValue == "" || $maxValue == null) { $maxValue = 0; öffentliche Funktion getCount($table, $field_name, $where = '', $debug = false) { $strSql = "SELECT COUNT($field_name) AS NUM FROM $table"; if ($where != '') $strSql .= " WHERE $where"; if ($debug === true) $this->debug ($strSql); $arrTemp = $this->query($strSql, 'Row'); return $arrTemp['NUM']; } /** * Anzahl der angegebenen Spalten abrufen * @param string $where * @param bool $debug * @return int */ öffentliche Funktion getTableEngine($dbName, $tableName) { $strSql = "SHOW TABLE STATUS FROM $dbName WHERE Name='".$tableName."'"; $arrayTableInfo = $this->query($strSql); $this->getPDOError(); return $arrayTableInfo[0]['Engine']; }
/** * beginTransaction Transaktion beginnt */ private function beginTransaction() { & () { $this->dbh->commit(); }
/** * Transaktionsübermittlung festschreiben */ private function rollback() { $this->dbh->rollback(); }
/** * Rollback-Transaktions-Rollback */ public function execTransaction($arraySql) { $retval = 1; $this->beginTransaction(); foreach ($arraySql as $strSql) { if ($this->execSql($strSql) == 0) $retval = 0; } if ($retval == 0) { $this->rollback(); return false; } else { $this->commit(); return true; } } /** * Transaktion verarbeitet mehrere SQL-Anweisungen über Transaktionen * Vor dem Aufruf müssen Sie mit getTableEngine ermitteln, ob die Tabellen-Engine Transaktionen unterstützt * * @param array $arraySql * @return Boolean */ private function checkFields($table, $arrayFields) { $fields = $this-> ;getFields($table); foreach ($arrayFields as $key => $value) { if (!in_array($key, $fields)) { $this->outputError("Unbekannte Spalte `$key` in der Feldliste.");
private Funktion getFields($table) { $fields = array(); $recordset = $this->dbh->query( "SHOW COLUMNS FROM $table"); $this->getPDOError(); $recordset->setFetchMode(PDO::FETCH_ASSOC); $ result = $recordset->fetchAll(); foreach ($result as $rows) { $fields[] = $rows['Field'];
{ if ($this->dbh->errorCode() != '00000') { $arrayError = $this->dbh- >errorInfo(); $this->outputError($arrayError[2]); } }
/** * getPDOError erfasst PDO-Fehlerinformationen */ private function debug($debuginfo) { var_dump($debuginfo); exit( ); }
/** * debug * * @param mixed $debuginfo */ private function outputError($strErrMsg) { throw new Exception('MySQL Error: '.$strErrMsg); }
/** * Fehlermeldung ausgeben * * @param String $strErrMsg */
|
Das obige ist der detaillierte Inhalt vonAnalyse der Vorteile des PHP-Singleton-Modus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

PHP bleibt ein leistungsstarkes und weit verbreitetes Tool in der modernen Programmierung, insbesondere im Bereich der Webentwicklung. 1) PHP ist einfach zu bedienen und nahtlos in Datenbanken integriert und für viele Entwickler die erste Wahl. 2) Es unterstützt die Erzeugung der dynamischen Inhalte und die objektorientierte Programmierung, die für die schnelle Erstellung und Wartung von Websites geeignet sind. 3) Die Leistung von PHP kann verbessert werden, indem Datenbankabfragen zwischengespeichert und optimiert werden, und die umfangreiche Community und sein reiches Ökosystem machen es im heutigen Technologiestack immer noch wichtig.

In PHP werden schwache Referenzen in der WeaPreference -Klasse implementiert und verhindern nicht, dass der Müllsammler Objekte zurückerobern. Schwache Referenzen eignen sich für Szenarien wie Caching -Systeme und Event -Hörer. Es ist zu beachten, dass es das Überleben von Objekten nicht garantieren kann und dass die Müllsammlung möglicherweise verzögert wird.

Mit der \ _ \ _ -Invoke -Methode können Objekte wie Funktionen bezeichnet werden. 1. Definieren Sie die Methode \ _ \ _, damit das Objekt aufgerufen werden kann. 2. Bei Verwendung der Syntax $ OBJ (...) wird PHP die Methode \ _ \ _ aufrufen. 3.. Geeignet für Szenarien wie Protokollierung und Taschenrechner, Verbesserung der Codeflexibilität und Lesbarkeit.

Fasern wurde in Php8.1 eingeführt, wodurch die gleichzeitigen Verarbeitungsfunktionen verbessert wurden. 1) Fasern ist ein leichtes Parallelitätsmodell, das Coroutinen ähnelt. 2) Sie ermöglichen es den Entwicklern, den Ausführungsfluss von Aufgaben manuell zu steuern, und eignen sich zum Umgang mit E/O-intensiven Aufgaben. 3) Die Verwendung von Fasern kann effizientere und reaktionsschnelle Code schreiben.

Die PHP -Community bietet umfangreiche Ressourcen und Unterstützung, um Entwicklern zu helfen, zu wachsen. 1) Zu den Ressourcen gehören offizielle Dokumentation, Tutorials, Blogs und Open -Source -Projekte wie Laravel und Symfony. 2) Die Unterstützung kann durch Stackoverflow-, Reddit- und Slack -Kanäle erhalten werden. 3) Entwicklungstrends können durch Befolgung von RFC gelernt werden. 4) Die Integration in die Community kann durch aktive Teilnahme, Beitrag zum Code und Lernfreigabe erreicht werden.

PHP und Python haben jeweils ihre eigenen Vorteile, und die Wahl sollte auf Projektanforderungen beruhen. 1.PHP eignet sich für die Webentwicklung mit einfacher Syntax und hoher Ausführungseffizienz. 2. Python eignet sich für Datenwissenschaft und maschinelles Lernen mit präziser Syntax und reichhaltigen Bibliotheken.

PHP stirbt nicht, sondern sich ständig anpasst und weiterentwickelt. 1) PHP hat seit 1994 mehreren Versionen für die Version unterzogen, um sich an neue Technologietrends anzupassen. 2) Es wird derzeit in E-Commerce, Content-Management-Systemen und anderen Bereichen häufig verwendet. 3) PHP8 führt den JIT -Compiler und andere Funktionen ein, um die Leistung und Modernisierung zu verbessern. 4) Verwenden Sie Opcache und befolgen Sie die PSR-12-Standards, um die Leistung und die Codequalität zu optimieren.

Die Zukunft von PHP wird erreicht, indem sich an neue Technologietrends angepasst und innovative Funktionen eingeführt werden: 1) Anpassung an Cloud Computing, Containerisierung und Microservice -Architekturen, Unterstützung von Docker und Kubernetes; 2) Einführung von JIT -Compilern und Aufzählungsarten zur Verbesserung der Leistung und der Datenverarbeitungseffizienz; 3) die Leistung kontinuierlich optimieren und Best Practices fördern.


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

MantisBT
Mantis ist ein einfach zu implementierendes webbasiertes Tool zur Fehlerverfolgung, das die Fehlerverfolgung von Produkten unterstützen soll. Es erfordert PHP, MySQL und einen Webserver. Schauen Sie sich unsere Demo- und Hosting-Services an.

Dreamweaver Mac
Visuelle Webentwicklungstools

ZendStudio 13.5.1 Mac
Leistungsstarke integrierte PHP-Entwicklungsumgebung

MinGW – Minimalistisches GNU für Windows
Dieses Projekt wird derzeit auf osdn.net/projects/mingw migriert. Sie können uns dort weiterhin folgen. MinGW: Eine native Windows-Portierung der GNU Compiler Collection (GCC), frei verteilbare Importbibliotheken und Header-Dateien zum Erstellen nativer Windows-Anwendungen, einschließlich Erweiterungen der MSVC-Laufzeit zur Unterstützung der C99-Funktionalität. Die gesamte MinGW-Software kann auf 64-Bit-Windows-Plattformen ausgeführt werden.

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen