Heim Backend-Entwicklung PHP-Tutorial Analyse der Vorteile des PHP-Singleton-Modus

Analyse der Vorteile des PHP-Singleton-Modus

Mar 03, 2018 pm 02:01 PM
php 优点 分析

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;
Nach dem Login kopieren




(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()方法,禁止克隆
Nach dem Login kopieren



(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;    
  
}
Nach dem Login kopieren


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:


<?php  
......  
//初始化一个数据库句柄  
$db = new DB(...);  
   
//添加用户信息  
$db->addUserInfo(...);  
   
......  
   
//在函数中访问数据库,查找用户信息  
function getUserInfo()  
{  
    $db = new DB(...);//再次new 数据库类,和数据库建立连接  
    $db = query(....);//根据查询语句访问数据库  
}  
   
?>
Nach dem Login kopieren
<?php class DB    {        private $_db;        private static $_instance;             private function __construct(...)        {            $this->_db = pg_connect(...);//postgrsql        }             private function __clone() {};  //覆盖__clone()方法,禁止克隆             public static function getInstance()        {            if(! (self::$_instance instanceof self) ) {                self::$_instance = new self();            }            return self::$_instance;        }             public function addUserInfo(...)      {      }       public function getUserInfo(...)      {       }     }     //test    $db = DB::getInstance();    $db->addUserInfo(...);    $db->getUserInfo(...);      ?>
Nach dem Login kopieren

下面的代码是PDO操作数据库类的一个封装,采用了单例模式:


/**

* 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

*/



调用方法:

1

2

3

4

5

6

require 'MyPDO.class.php';

$db = MyPDO::getInstance('localhost', 'root', '123456', 'test', 'utf8');

$db->query("select count(*) frome table");

$db->destruct();

?>

123456
select frome>$db->destruct();?>

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!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Java-Tutorial
1657
14
PHP-Tutorial
1257
29
C#-Tutorial
1229
24
Wie analysiert und verarbeitet man HTML/XML in PHP? Wie analysiert und verarbeitet man HTML/XML in PHP? Feb 07, 2025 am 11:57 AM

Dieses Tutorial zeigt, wie XML -Dokumente mit PHP effizient verarbeitet werden. XML (Extensible Markup-Sprache) ist eine vielseitige textbasierte Markup-Sprache, die sowohl für die Lesbarkeit des Menschen als auch für die Analyse von Maschinen entwickelt wurde. Es wird üblicherweise für die Datenspeicherung ein verwendet und wird häufig verwendet

Erklären Sie JSON Web Tokens (JWT) und ihren Anwendungsfall in PHP -APIs. Erklären Sie JSON Web Tokens (JWT) und ihren Anwendungsfall in PHP -APIs. Apr 05, 2025 am 12:04 AM

JWT ist ein offener Standard, der auf JSON basiert und zur sicheren Übertragung von Informationen zwischen Parteien verwendet wird, hauptsächlich für die Identitätsauthentifizierung und den Informationsaustausch. 1. JWT besteht aus drei Teilen: Header, Nutzlast und Signatur. 2. Das Arbeitsprinzip von JWT enthält drei Schritte: Generierung von JWT, Überprüfung von JWT und Parsingnayload. 3. Bei Verwendung von JWT zur Authentifizierung in PHP kann JWT generiert und überprüft werden, und die Funktionen und Berechtigungsinformationen der Benutzer können in die erweiterte Verwendung aufgenommen werden. 4. Häufige Fehler sind Signaturüberprüfungsfehler, Token -Ablauf und übergroße Nutzlast. Zu Debugging -Fähigkeiten gehört die Verwendung von Debugging -Tools und Protokollierung. 5. Leistungsoptimierung und Best Practices umfassen die Verwendung geeigneter Signaturalgorithmen, das Einstellen von Gültigkeitsperioden angemessen.

Erklären Sie die späte statische Bindung in PHP (statisch: :). Erklären Sie die späte statische Bindung in PHP (statisch: :). Apr 03, 2025 am 12:04 AM

Statische Bindung (statisch: :) implementiert die späte statische Bindung (LSB) in PHP, sodass das Aufrufen von Klassen in statischen Kontexten anstatt Klassen zu definieren. 1) Der Analyseprozess wird zur Laufzeit durchgeführt.

PHP -Programm zum Zählen von Vokalen in einer Zeichenfolge PHP -Programm zum Zählen von Vokalen in einer Zeichenfolge Feb 07, 2025 pm 12:12 PM

Eine Zeichenfolge ist eine Folge von Zeichen, einschließlich Buchstaben, Zahlen und Symbolen. In diesem Tutorial wird lernen, wie Sie die Anzahl der Vokale in einer bestimmten Zeichenfolge in PHP unter Verwendung verschiedener Methoden berechnen. Die Vokale auf Englisch sind a, e, i, o, u und sie können Großbuchstaben oder Kleinbuchstaben sein. Was ist ein Vokal? Vokale sind alphabetische Zeichen, die eine spezifische Aussprache darstellen. Es gibt fünf Vokale in Englisch, einschließlich Großbuchstaben und Kleinbuchstaben: a, e, ich, o, u Beispiel 1 Eingabe: String = "TutorialPoint" Ausgabe: 6 erklären Die Vokale in der String "TutorialPoint" sind u, o, i, a, o, ich. Insgesamt gibt es 6 Yuan

Was sind PHP Magic -Methoden (__construct, __Destruct, __call, __get, __set usw.) und geben Sie Anwendungsfälle an? Was sind PHP Magic -Methoden (__construct, __Destruct, __call, __get, __set usw.) und geben Sie Anwendungsfälle an? Apr 03, 2025 am 12:03 AM

Was sind die magischen Methoden von PHP? Zu den magischen Methoden von PHP gehören: 1. \ _ \ _ Konstrukt, verwendet, um Objekte zu initialisieren; 2. \ _ \ _ Destruct, verwendet zur Reinigung von Ressourcen; 3. \ _ \ _ Call, behandeln Sie nicht existierende Methodenaufrufe; 4. \ _ \ _ GET, Implementieren Sie den dynamischen Attributzugriff; 5. \ _ \ _ Setzen Sie dynamische Attributeinstellungen. Diese Methoden werden in bestimmten Situationen automatisch aufgerufen, wodurch die Code -Flexibilität und -Effizienz verbessert werden.

PHP und Python: Vergleich von zwei beliebten Programmiersprachen PHP und Python: Vergleich von zwei beliebten Programmiersprachen Apr 14, 2025 am 12:13 AM

PHP und Python haben jeweils ihre eigenen Vorteile und wählen nach den Projektanforderungen. 1.PHP ist für die Webentwicklung geeignet, insbesondere für die schnelle Entwicklung und Wartung von Websites. 2. Python eignet sich für Datenwissenschaft, maschinelles Lernen und künstliche Intelligenz mit prägnanter Syntax und für Anfänger.

PHP: Eine Schlüsselsprache für die Webentwicklung PHP: Eine Schlüsselsprache für die Webentwicklung Apr 13, 2025 am 12:08 AM

PHP ist eine Skriptsprache, die auf der Serverseite weit verbreitet ist und insbesondere für die Webentwicklung geeignet ist. 1.PHP kann HTML einbetten, HTTP -Anforderungen und Antworten verarbeiten und eine Vielzahl von Datenbanken unterstützt. 2.PHP wird verwendet, um dynamische Webinhalte, Prozessformdaten, Zugriffsdatenbanken usw. mit starker Community -Unterstützung und Open -Source -Ressourcen zu generieren. 3. PHP ist eine interpretierte Sprache, und der Ausführungsprozess umfasst lexikalische Analyse, grammatikalische Analyse, Zusammenstellung und Ausführung. 4.PHP kann mit MySQL für erweiterte Anwendungen wie Benutzerregistrierungssysteme kombiniert werden. 5. Beim Debuggen von PHP können Sie Funktionen wie error_reporting () und var_dump () verwenden. 6. Optimieren Sie den PHP-Code, um Caching-Mechanismen zu verwenden, Datenbankabfragen zu optimieren und integrierte Funktionen zu verwenden. 7

PHP in Aktion: Beispiele und Anwendungen in realer Welt PHP in Aktion: Beispiele und Anwendungen in realer Welt Apr 14, 2025 am 12:19 AM

PHP wird in E-Commerce, Content Management Systems und API-Entwicklung häufig verwendet. 1) E-Commerce: Wird für die Einkaufswagenfunktion und Zahlungsabwicklung verwendet. 2) Content -Management -System: Wird für die Erzeugung der dynamischen Inhalte und die Benutzerverwaltung verwendet. 3) API -Entwicklung: Wird für die erholsame API -Entwicklung und die API -Sicherheit verwendet. Durch Leistungsoptimierung und Best Practices werden die Effizienz und Wartbarkeit von PHP -Anwendungen verbessert.

See all articles