Dobro zastavljeni sistemi večinoma prenašajo objekte preko klica metod.
Vsak objekt ohrani samostojnost od sistema. S ostalimi objektni v sistemu komunicira preko jasno določenih vmesnikov.
Včasih je to pretiravanje in vnese v sistem dodatno odvisnost, saj morajo določeni razredi sprejeti in prenašati določen objekt samo za to, da ga prenesejo naprej ostalim objektom.
Uporaba globalnih spremenljivk je zelo slaba praksa, saj močno povečuje odvisnost.
Verjetnost, da se bodo globalne spremenljivke med seboj povozile se poveča, še posebej če ne uporabimo “namespace” za zaščito.
Izdredno slaba stran jezika PHP, da nima sistema, ki bi zaznaval, da je prišlo do “kolizije” spremenljivk.
Kolizije se sploh ne bodo opazile in bodo povzročale čudne napake, ki jih je izjemno težko odkriti in odpraviti.
Problem se pojavi večinoma pri raznih konfiguracijah in posebnih informacijah, ki morajo biti sistemu dostopne v vsakem trenutku.
Rešitev je objekt, ki bo dostopen vsem objektom v sistemu in bo samo eden. Pravimo mu” singleton” vzorec.
Tak objekt lahko uporabimo za shranjevanje nastavitev oziroma česarkoli, kar je globalno dostopno in na voljo v samo enem paketu/razredu.
class Nastavitve { private $spremenljivke = array(); private static $instanca; //Privaten konstruktor onemogoci kakrsnokoli spreminjanje oz istanciranje objekta kjerkoli v sistemu private function __construct() {} public function nastaviSpremenljivko($kljuc, $vrednost) { $this->spremenljivke[$kljuc] = $vrednost; } public function dobiSpremenljivko($kljuc) { return $this->spremenljivke[$kljuc]; } public static function dobiInstanco() { if(empty(self::$instanca)) { self::$instanca = new Nastavitve(); } return self::$instanca; } } /*kjer koli v sistemu se lahko dobi samo ena instanca objekta Nastavitve preko staticnega klica * Metoda dobiInstanco deluje v staticnem kotekstu na razredu in lahko zaspolni staticno vrednost katero vrne * V primeru da ze ima staticno vrednost jo samo vrne */ $nastavitve = Nastavitve::dobiInstanco(); $nastavitve->nastaviSpremenljivko('test', 'Testna vrednost'); unset($nastavitve); $nastavitve = Nastavitve::dobiInstanco(); echo $nastavitve->dobiSpremenljivko('test');
Singleton objekt ustvarimo tako, da naredimo razred s privatnim konstruktorjem.
To se morda na prvi trenutek zdi absurdno ampak ni, saj ravno to preprečuje, da bi objekt naredili s klientovo kodo.
Naredimo si nek kontejner, kamor želimo spraviti informacije v mojem primeru je to $spremenljivke.
Naredimo metode za shranjevanje in pridobitev informacij, ki smo jih shranli v kontejner $spremenljivke.
Sedaj nam ostane problem, da nikakor ne morem narediti objekta iz razreda, saj ima objekt privat konstruktor.
Edin način za dostopanje do objekta je tako uporaba statičene spremenljivke.
Statične spremenljivke in metode se izvajajo nad razredom in ne objektom. Tako si lahko v sam razred shranimo instanco samega sebe.
Objekt samega sebe shranimo v razred.
Edina metoda, ki to naredi je dobiInstanco(). Ta preverja, ali se je objekt že ustvaril in če se je samo vrne že narejen objekt samega sebe.
V primeru da objekt še ni narejen, ga naredi, shrani v statično spremenljivko $instanca in ga vrne.
Zaradi vsega tega razred Nastavitve vsebuje skozi celo življenjsko dobo objekt Nastavitve, ki ga lahko po mili volji spreminjamo in uporabljamo ter
je na voljo celotnemu sistemu.