PHP – Singleton-mönstret

digitateam





Singleton-mönstret är ett av GoF-mönstren (Gang of Four). Detta speciella mönster tillhandahåller en metod för att begränsa antalet instanser av ett objekt till bara en. Det är ett lätt mönster att förstå när du väl kommit förbi den konstiga syntaxen som används.


Tänk på följande klass:


PHP-kod:

class Database { public function __construct() { … } public function connect() { … } public function query() { … } … }

Denna klass skapar en anslutning till vår databas. Varje gång vi behöver en anslutning skapar vi en instans av klassen, till exempel:


PHP-kod:

$pDatabase = new Database(); $aResult = $pDatabase->query(‘…’);

Låt oss säga att vi använder metoden ovan många gånger under ett skripts livstid, varje gång vi skapar en instans skapar vi ett nytt databasobjekt (vi skapar också en ny databasanslutning, men det är irrelevant i det här exemplet) och använder därför mer minne. Ibland kanske du avsiktligt vill ha flera instanser av en klass men i det här fallet gör vi inte det.


Singleton-metoden är en lösning på detta vanliga problem. För att göra databasklassen till en Singleton måste vi först lägga till en ny egenskap till klassen, vi kallar denna $m_pInstance:


PHP-kod:

class Database { // Lagra den enskilda instansen av Database private static $m_pInstance; … }

Som kommentaren anger kommer den här egenskapen att användas för att lagra den enda instansen av vår databasklass. Du bör också notera att den här egenskapen måste vara statisk.


Därefter måste vi ändra konstruktörens omfattning till privat. Det här är en av de konstiga syntaxerna som vanligtvis förvirrar människor.


PHP-kod:

class Database{// Lagra den enskilda instansen av Database private static $m_pInstance; privat funktion __construct() { … } }

Genom att göra konstruktorn privat har vi förbjudit objekt i klassen från att instansieras utanför klassen. Så till exempel följande fungerar inte längre utanför klassen:


PHP-kod:

$pDatabase = new Database();

Vi behöver nu lägga till en metod för att skapa och returnera vår Singleton. Lägg till följande metod till klassen Databas:


PHP-kod:

public static function getInstance(){ if (!self::$m_pInstance){ self::$m_pInstance = new Database(); } returnera self::$m_pInstance; }

Denna roliga funktion är ansvarig för att hantera vår objektinstans. Det är relativt lätt att förstå, i princip kontrollerar vi vår statiska egenskap $m_pInstance, om den inte är giltig skapar vi en ny instans av klassen Database genom att anropa konstruktorn. Kom ihåg att vi gjorde metoden __construct() privat, så en instans av objektet kan bara skapas inifrån klassens metoder. Slutligen returnerar funktionen en referens till vår statiska egenskap. Vid efterföljande anrop till getInstance(), kommer $m_pInstance att vara giltig och referensen kommer därför att returneras – inga nya instanser skapas.


Så vår databasklass ser nu ut ungefär så här


PHP-kod:

class Database{// Lagra den enskilda instansen av Database private static $m_pInstance; privat funktion __construct() { … } offentlig statisk funktion getInstance(){ if (!self::$m_pInstance){ self::$m_pInstance = new Database(); } returnera self::$m_pInstance; } }

Du kan nu få en instans av klassen Database var som helst (utan att använda globaler eller funktionsargument) i ditt projekt. Här är ett exempel och jämförelse:


Det här är det vanliga sättet vi skapar objekt:
PHP-kod:

$pDatabase = new Database(); $aResult = $pDatabase->query(‘…’);

Detta är Singleton-sättet:
PHP-kod:

$pDatabase = Database::getInstance(); $aResult = $pDatabase->query(‘…’);

Sammanfattningsvis är Singleton ett lättanvänt designmönster för att begränsa antalet instanser av ett objekt.


















projekt

Bokning gratis bokningsmotor

Pizzerialeverans i Palma de Mallorca, Mamma Teresa

































Vi använder våra egna och tredje parts cookies för att förbättra våra tjänster, sammanställa statistisk information och analysera dina surfvanor. Detta gör att vi kan anpassa innehållet vi erbjuder och visa dig annonser som är relaterade till dina preferenser. Genom att klicka på “Acceptera alla” godkänner du lagringen av cookies på din enhet för att förbättra webbplatsnavigering, analysera trafik och hjälpa våra marknadsföringsaktiviteter. Du kan också välja “Endast systemcookies” för att endast acceptera de cookies som krävs för att webbplatsen ska fungera, eller så kan du välja de cookies du vill aktivera genom att klicka på “inställningar”.

Acceptera alla Endast systemcookies Konfiguration

Alltid aktiv

Strikt nödvändiga cookies

Dessa cookies är nödvändiga för att webbplatsen ska fungera och kan inte inaktiveras i våra system. De ställs i allmänhet bara in som svar på dina handlingar när du begär tjänster, som att ställa in dina integritetsinställningar, logga in eller fylla i formulär. Du kan ställa in din webbläsare för att blockera eller varna dig för dessa cookies, men vissa delar av webbplatsen kommer inte att fungera. Dessa cookies lagrar ingen personligt identifierbar information
















Next Post

Tyska domstolsregler Webbplatser som bäddar in Google-teckensnitt bryter mot GDPR

En regional domstol i den tyska staden München har dömt en webbplatsoperatör att betala 100 euro i skadestånd för att ha överfört en användares personuppgifter – det vill säga IP-adressen – till Google via biblioteket från sökjättens källor utan individens medgivande. Den anonyma webbplatsens obehöriga avslöjande av kärandens IP-adress till […]

Subscribe US Now