spájame
slovenskú
IT komunitu
pridaj sa
Registrácia · Login

Marek Gura 23.2.2012
Hodnoť článok:
0 1

OOP PHP a ich tajné zákutia. 1. diel ako riadime beh naších inštancíi

PHP Singleton

V tomto článku si vysvetlíme na čo sa nám dobre budú používať singletony v Objektovom programovaní. Na čo nám vlastne singleton slúži?
Singleton nám slúži na jednotné spúšťanie procedúry alebo inštancie triedy. Zabezpečuje nám aby sme do pamäte nenačítavali objekt viacej krát, keď chceme využívať samostatnú metodiku. Pri singleton volaniu je dobré nepoužívať deštruktory z dôvodu mazania objektu po výkone. Singleton nám zabezpečí chod aplikácie rýchlejšie a efektívnejšie než si viete predstaviť. Nebudem Vám tu popisovať prečo a ako ale rovno vám napíšem príklad.

Priklad 1. (objekt bez singleton)

class objekt extend object2{
  function __construct(){
    parent::test();
  }
}

class object2{
  funtion test(){
    echo "ahoj svet";
  }
}

V prvom príklade vidíte bežný objekt, ktorý prenáša vlastnosti druhého objektu, ale ak chcem spustiť danú inštanciu mimo spusteného kódu opätovne ju musím spustiť štartom new class.
To znamená, že pre beh aplikácie nie je dobré keď všade v kóde nám sa zapínajú inštancie a dosť veľkou chybou zo strany programátora je, že nevykonajú deštrukciu a čistenie objektu z pamäte.
Na takúto kolíziu alebo pretekanie objektu v pamäti môžeme hravo vyriešiť cez OOP singleton.
uvediem príklad

//trieda,ktora bude staticky pristupna všade v kóde
class trieda1{
  	private static $volanie_sekundarnej_triedy;
  	static function start_procedure(){
    	if(!self::$volanie_sekundarnej_triedy)
    		self::$volanie_sekundarnej_triedy	=	new trieda2;
    	return self::$volanie_sekundarnej_triedy;
  	}
}
//trieda, ktora je sekundovaná a nevyžaduje stale spúštanie konstroktorom
class trieda2{
	function __construct(){
		echo "spustil som sa";
	}
 	public function a(){
  		echo 'funkcia A';
 	}
	 public function b(){
 		echo 'funkcia B';
	}
}
/*
 * V tomto objekte1 nam vypise
 *
 * spustil som sa
   funkcia A
   funkcia B
 */
$objekt1				=	trieda1::start_procedure();
$objekt1->a();
$objekt1->b();
/*
 * V tomto objekte2 nam vypise
 *
 *
   funkcia A
   funkcia B
 */
$objekt2				=	trieda1::start_procedure();
$objekt2->b();
$objekt2->a();

Čo nám tento príklad hovorí?
Tento príklad nám vraví, že hocikde v kóde aplikácie sa môžeme staticky dotazovať na objekt a nebude sa nám zbytočne spúšťať inštancia objektu a ušetrí nám čas na prístup k metódam a tým urýchli aj beh samotnej aplikácie.

Nabudúce si povieme na čo nám slúži polymorfný kód.

Dúfam že sa Vám článok bude páčiť. :=)

Pokračovanie pre neveriacich :}

Uvediem príklad pre ľudí čo majú mylné informácie o singleton.


class Example
{
    private static $instance;
    private $count = 0;

    private function __construct()
    {
    }

    public static function singleton()
    {
        if (!isset(self::$instance)) {
            echo 'Creating new instance.';
            $className = __CLASS__;
            self::$instance = new $className;
        }
        return self::$instance;
    }

    public function increment()
    {
        return $this->count++;
    }

    public function __clone()
    {
        trigger_error('Clone is not allowed.', E_USER_ERROR);
    }

    public function __wakeup()
    {
        trigger_error('Unserializing is not allowed.', E_USER_ERROR);
    }
}

$singleton = Example::singleton(); // prints "Creating new instance."
echo $singleton->increment(); // 0
echo $singleton->increment(); // 1

$singleton = Example::singleton(); // reuses existing instance now
echo $singleton->increment(); // 2
echo $singleton->increment(); // 3

// all of these will raise a Fatal Error
$singleton2 = new Example;
$singleton3 = clone $singleton;
$singleton4 = unserialize(serialize($singleton));

Toto je názorná ukážka z PHP.net

Pekný večer Vám prajem.

Marek Gura Marek Gura

Pracujem ako IT programátor v PHP, MySQL, xHTML,CSS, JS v spoločnosti Kcorp s.r.o v spišskej novej vsi. Moja špecializácia sú databázy MySQL a PHP core interface API. Mojou náplňou je tvorba redakčných a štatistických aplikácií na riadenie výroby vo veľkých spoločnostiach. Ďalej mojou náplňou je písanie aplikácií v JS a jQuery aplikácií. Programovaniu sa profesionálne už venujem 7 rokov ako podnikateľ a aj ako "fanatik". Moja práca je aj mojím koníčkom. Rád sa podelím s vami so skúsenosťami.


Hodnoť článok:
0 1

25 komentárov k článku:

Komentovať môžu iba prihlásení

Zaregistruj sa cez bezplatnú registráciu alebo použi login cez Facebook (FB Connect)

Prihlás sa tu, ak už máš profil na Zajtra.sk:


Zabudol som heslo

0 0 Matej Víťaz 31.1.2014 03:02:53
Mám otázku. Prečo by som mal použiť singleton triedu (bude mať max jednu inštanciu) namiesto použitia abstract triedy so s statickými metódami ?

Mám na mysli niečo takéto:

abstract class Application {
public static function start() {
// niečo...
}

public static function end() {
// niečo...
}

// atď...
}

Application::start();
// ...
Application::end();
// ...

Ak by som použil singleton mal by som jednu inštanciu. Takto nemám žiadnu a je mi to fuk. Môžete mi napísať (ne)výhody týchto dvoch prístupov ? Ďakujem.
0 0 Neo 15.3.2012 10:04:22
@marian
Tak bol by som rad keby si mi uviedol nejaky priklad ako sa to moze stat ak mas vacsi tim. Ja mam sice velku predstavivost ale aby niekto vytvaral viac instancii ked nechce tak to si fakt neviem predstavit :-)
0 0 Marián Veselý 11.3.2012 09:21:43
Aj keď je to už trochu stará diskusia, nedalo mi nepridať aj moju trochu do ohňa. Snáď to niekomu do budúcnosti pomôže. :)

@Marek:
Je celkom ťažké sa vyznať v tom, o čom hovoríš, lebo používaš prinajmenšom nezvyčajnú terminológiu. Keď hovoríš o "spustenom" objekte a "behu" inštancií, viac ako OOP to pripomína procedurálne programovanie a začiatočníkov (ktorým tento članok bol zrejme určený) to môže viesť k nesprávnej predstave. Objekty niesú procedúry, ale zaobalené dáta a tie sa nespúšťajú ale vykonávaš nad nimi operácie pomocou z vonku prístupného rozhrania (interface, pozostávajúci z metód).

Čo sa týka použitia Singletonu, požičiam si jednu vetu z už spomínaného php.net: "The Singleton ensures that there can be only one instance of a Class and provides a global access point to that instance." Ako vidíš, účel Singletonu je zabrániť existencii viacerých instancií jedinej triedy. To je hlavný význam tohto vzoru a žiaden iný. Častokrát som videl (hlavne php programátorov) používať Singleton pre databázové pripojenia. Keďže pripojenie chceme vytvoriť len raz, vložiť ho do konštruktoru a spraviť triedu ako Singleton (čo zaistí, že konštruktor sa zavolá maximálne raz) sa veľa ľudom zdá byť dobré riešenie. Toto môže byť aj súvislosť, podľa ktorej si usúdil, že sa používa na optimalizáciu. Niesom PHP programátor, takže neviem ohodnotiť ako dobrý alebo zlý je tento nápad, ale ak by si niečo také spravil pri písaní webového serveru, ktorý PHP interpretuje, skončil by si s jediným pripojením k databáze a server by nebol schopný obsluhovať viac požiadavkov ktoré pracujú s databázou súbežne (a taký server je nanič).

Druhá spomínaná vec v tej vete je "global access". Jediný rozdiel medzi globálnymi premennými a Singleton triedou prístupnou zovšadiaľ je, že globálne premenné ti znečistia namespace (ak ten pojem nepoznáš, viď http://en.wikipedia.org/wiki/Namespace_(computer_science)). Inak je to ale rovnaká záležitosť. Singleton ku ktorému môžeš pristupovať zovšadiaľ zanáša coupling (párovanie, viď http://en.wikipedia.org/wiki/Low-Coupling_/_High-Cohesion_pattern#Disadvantages) tried. To znamená, že ak chceš nejakú triedu oddeliť od programu a použiť inde, ale ona používa ten Singleton, musíš tento Singleton preniesť s ňou. Tomuto (a ďalším problémom) sa pri návrhu snažia všetci zabrániť a coupling minimalizujú.

Je škoda, že keď už si si požičal ukážku kódu pre Singleton z php.net, nepozrel si sa aj na to, čo je priamo pod ňou, a teda zvýraznené varovanie, že Singleton je dosť kontroverzný návrhový vzor. Môj skromný názor je snažiť sa mu vyhnúť vždy keď to ide (čo samozrejme nemusí byť vždy jednoduché).

@Neo:
Väčšinou sa ti niečo také nestane ak makáš na niečom v malom týme (povedzme do 10 ľudí). Akonáhle ale začneš mať niečo veľké, tak sa môže stať všeličo, od ľudí ktorý strkajú nos kam nemajú, až po potrebu niekoľkých instancií aj keď si to pri písaní tej triedy nepredpokladal. Preto sa často používa kontrola kompilátoru/interpreteru toho-ktorého jazyka, aby sa týmto problémom zamedzilo čo najskor.

@Milan
Pekne si prispieval, hlavne tie odkazy niesú zlé. :) Čo sa týka toho kedy Singleton nepoužiť, povedal by som, že prístup rôznych vláken súbežne je pre singleton pohroma. To isté platí o testovaní a ďalšia taká vec čo ma napadá je situácia, kedy je Singletony treba mazať a oni sú na sebe závislé nejakým nepekným spôsobom. Povedzme, že máš (vykonštruovaný prípad) Singletony Window, Logger a DatabaseManager. Niekde dojde k chybe a Logger to ma zapísať do databázy (DatabaseManager) a zároveň zobraziť dialóg ktorý musí patriť k oknu (Window). Čo ale ak k tejto chybe dojde vo Window po tom, čo sa DatabaseManager už zničil (prípadne opačná situácia)? Toto je ale skôr problém nízkoúrovňových jazykov a nie záležitostí ako PHP, Java alebo C#. Taktiež, ak by si niekedy písal framework, je možno lepšie sa od začiatku vyhýbať Singletonom, než ich odstrániť neskôr a donútiť užívateľov prekopávať tisícky riadkov kódu pri prechode na novú verziu.
0 0 Marek Gura 28.2.2012 23:10:58
NEO: globalne pristupujem k insancii,singleton mi zabezpeci len to ze sa mi spusti metoda spusteneho objektu. NEPOZERAJ SA NA POUZITIE SINGLETON V MOJOM CLANKU,ale na celiovy pristup.To ako ja pouzivam singleton ako globalny pristup k metodam spusteneho objektu je druha vec.


Xking: Ludia nie su neomylni tvorovia,ako som uz neovi pisal, moje pouzitie demonstrovalo moje vyuzitie reAlne. Pre mna singleton riesi beh insancii v samotnom core aplikacii.to ako pristupujem k danej instancii je moj zvoleny pristup.100 ludi a 100 nazorov. Za druhe,ja tu nikoho,neurazam. O vyske schopnosti a vedomosti o druhom cloveku by som sa nerad vyjadroval,lebo nikdy nevies ako realne riesi clovek vyvoj. A na tvoj dalsi podnet reagujem jednoducho,raz odpovedam mobilom,raz tabletom a niekedy na notebooku. Chlapy je lahke kritizovat,ale ukazte vase vnimanie na singleton ako taky samotny. Tiez viem hovorit o ferrari ake je super,ale mna nezaujima ze je super,ale preco... Ja pouzivam singleton roznym sposobom,nielen tymto. Nabuduce pripravim clanok pre kritikov viac globalny,lebo moje riesenie bolo dost sektorialne.
0 0 xKing.Bearx 28.2.2012 17:24:24
Odhliadnuc od toho, že článok je dosť zlé použitie Singletonu (od "fanatika" by som čakal teda viac vedomostí), tak máš strašne veľa chýb (gramatických) v článku aj v komentároch. Pripadá mi to, že buď ti nefungujú niektoré klávesy na klávesnici alebo po sebe vôbec nečítaš. Niet divu, že potom píšeš chybné články. Pravdepodobne si ho napísal bez toho, aby si to po sebe skontroloval, potom by ti možno okrem gramatických chýb neušli aj tie programátorské.
0 0 Neo 27.2.2012 16:13:36
@Marek
Zase taras odveci.Ty pouzivas singleton nie preto ze chces jedinecnu instanciu ale preto ze potrebuejs globalny pristup k nejakemu servicu a nevies to inak nakodovat.
A naozaj nepotrebujem poucat o tom co je Singleton od cloveka ktory to sam pred par dnami nevedel a spravil uplne odveci clanok co zo Singletonom nema nic spolocne.

@Milan
"Neo ... podla mna je uplna hlupost sa spoliehat na to, ze ak chces jednu instaciu tak si ju spravis. Ano spravis si ju, ale singleton ti zabrani vo vytvoreni novej.Takze ako taky chrani pred chybou programatora."
To si fakt neviem predstavit ako niekto moze omylom vytvorit viac instancii ako chce. Ale urcite su aj hlupejsi programatori ako napr autor clanku.

"Samotny ten wrapper alebo container alebo ako sa to vola by som musel raz vytvorit a predavat ho ako dependency napr. model-u, view-u a controller-u ... ci? "
Precitaj si toto , je to trochu iny pristup , kde samotny container nemusis predavat
http://miller.limethinking.co.uk/2011/07/07/dependency-injection-moving-from-basics-to-container/
0 0 Milan Vodička 26.2.2012 00:31:35
A este jeden clanok, ktory vravi kedy je trieda naozaj singleton a tak .. dobre citanie

http://www.ibm.com/developerworks/webservices/library/co-single/index.html
0 0 Milan Vodička 26.2.2012 00:18:24
No sigleton sa da plne nahradit dependency injection metodou repsektive wrapperom. Singleton sa vo vseobecnosti povazuje za zly, pretoze sa tazko testuje. Samotna dependency injection je vyhodne v tom, ze sa lahko tvoria mockupy, ktore vsunies ako dependency pri testovani i ked potrebne dependency nemusi zatial vobec existovat. Neo ... podla mna je uplna hlupost sa spoliehat na to, ze ak chces jednu instaciu tak si ju spravis. Ano spravis si ju, ale singleton ti zabrani vo vytvoreni novej. Takze ako taky chrani pred chybou programatora.

http://www.slideshare.net/fabpot/dependency-injection-with-php-and-php-53

Kazdopadne by som si rad velmi konkretne vypocul preco by som sa mal singletonom vyhnut. Okrem toho by teraz nenapada ako by som postavil DI Wrapper tak aby som ho mal pristupny vsade. Samotny ten wrapper alebo container alebo ako sa to vola by som musel raz vytvorit a predavat ho ako dependency napr. model-u, view-u a controller-u ... ci?

Sry ak hovorom z cesty ... ziadne hadky nechcem vyvolavat ;)
0 0 Marek Gura 25.2.2012 22:40:18
Nemýľ si globálne premenné. Globálna premenná ti nezabezpečí jedinečný chod inštancie. Globálna premenná je len všeobecný všadeprítomný prístup k premieňanej hodnote (funkcii, objektu, stringu, atď)... Nezabezpečí to singleton, nemýľ si singleton so statickými metódami a ani globálnymi premennými. Skús si preložiť slovo singleton... Čo sa týka overenia behu inštancie si vieš overiť cez instanceof čiže if(instanceof == 'classname')
ale toto ti nezabezpečí na napojenie konkrétneho vlákna v behu inštancie. Preto tu máme singleton. Chcem vedieť ako sa bez singleton napojíš na daný bežiaci objekt. aby si využil len ten čo beží...
0 0 Neo 25.2.2012 21:49:35
"Skús skôr povedať ako by si ty beh aplikácie alebo beh daných inštancií v ľubovolnej časti kódu optimalizoval na jednu inštanciu bez singleton. "

Co chces optimalizovat na jednej instancii?
Ked chcem jednu instanciu , tak si vytvorim jednu instanciu a hotovo. To ze ty nevies navrhnuj kod bez globalnej premmenj(Singleton pre takych ako ty sluzi primarne ako globalna instancia, ktoru mozu pouzit hocikde v kode , co je typicke pre spagetovy kod) tak to uz nie je moj problem.
0 0 Marek Gura 25.2.2012 15:22:23
Skús opísať z akého dôvodu by sa mu mali ľudia vyhýbať... Je jedna vec povedať, druhá vec ju obhájiť. Skús danú problematiku opísať, aby bola potom objektívnosť na mieste. Z akého dôvodu nie je vhodné použitie singleton keď v OOP jazykoch je často používaný od C++, java, C# a PHP nevynímajúc.
Možno je problém v tom, že ľudia ho moc nepoužívajú... Skús skôr povedať ako by si ty beh aplikácie alebo beh daných inštancií v ľubovolnej časti kódu optimalizoval na jednu inštanciu bez singleton.
Ja beriem objektívnu kritiku, nie presadzovanie svojho postoja voči postupu, ktorí navrhli sami tvorcovia PHP a iných OOP jazykov. Nabudúce keď budem písať článok, budem ho špecifickejšie rozvíjať, viem že ten článok som mohol viac rozpísať, ale v budúcnosti to zmením.
0 0 Neo 25.2.2012 12:18:11
Takze este raz.
Tvoj povodny clanok nema nic spolocne zo Singletonom.Vsetci komentujuci sa vyjadrili vtom duchu.
To dufam uznavas ?

Ja som okrem toho ze tvoj clanok je nezmysel vyjadril aj svoj subjektivny nazor(sktorym vela ludi nemusi suhlasit) ze Singelton je anti-pattern a do buducnosti by sa mu mal kazdy co najviac vyhybat.
0 0 Marek Gura 25.2.2012 10:30:12
Je ľahké polemizovať, uveď dôvody prečo sú nevýhodou podla tvojho vyjadrenia. Ďalej mi ozrejmi ako vnímaš singleton, lebo potom PHP.net by tiež boli mimo singleton podľa tvojho vyjadrenia. Prečítaj si poriadne tie príspevky a potom opisuj logiku. Tie opisi sú funkčné a presné.
0 0 Neo 24.2.2012 23:28:43
@Marek
Tvoje prispevky su tak isto nelogicke a popletene ako tvoje clanky sorry :-D
Ten priklad zo Smarty nepoukazuje na ziadnu vyhodu Singletonu.
Ano Singleton bol preferovany design pattern pred 5 a viac rokmi a preto ho este aj dnes pouziva vela frameworkov. Nastastie top frameworky ako Symfony a Zend uz pochopili ze Singleton je zlo.
A este raz opakujem, povodny clanok je uplne zly a zo Singletonom nema nic spolocne.
0 0 Marek Gura 24.2.2012 19:05:50
Neo ten kod som tu demonstroval pre takych ako si ty... Čo sa týka singleton, nepochopil i jeho činnosť keď píšeš to čo píšeš... Najprv čítaj pre čo je využitie singleton. Nikdo sa tu nebavil o jednom objete spustenom raz a jeho metódach, ale článok je určený pre použitie v širšiom spektre projektov, kde sa dopytuješ na jedn objekt viacej krát, napriklad na spojenie s sql a jeho nadviazaniu. Potom by flourish triedy s opensource dielni boli na prd ako to ty popisuješ, lebo tie knižnice sú postavené na singleton a Nette detto... Čiže mám taký pocit, že nevieš ani čo tu kritizuješ... Najprv si naštuduj na čo je jeho využitie a potom mi tu vypisuj kritiku. Objekt a jeho metóda je navrhnutá tak aby bola využiteňa všade, so súčinnosťou statických metod objektu je použitený singleton na spustenie iného objektu, ale to unikátne, dokial nepotrebujeme odovzdávať aparatúru konštruktoru čo pri vedšine objektom typu CORE nie je zvykom. Napríklad pri použití smarty template Php nemusim furt jak debil zapínať nový objekt v inom PHP mimo vnorenia. A druha vec mi potom smartz nebeží dva razi ale len rad, tým pádom dokážem pristupovať k jeho metodike a hravo ju ovládať prostrednítovm napríklad statickej metódy.
napríklad v mojom príklade
$smarty = core::smarty();
$smarty->assign();
Tu demon3trujem s=ice statickú metodu v objekte core,
ale v danej metode je singleton
static function smarty(){
if(!self::$smarty_call){
self::$smarty_call = new Smarty;
.....nastavenie atď

}return self::$smarty;
}

Čiže tu je ten singleton a som si istý a vo vlastnej praxy mám odskúšané pravdivosť článku.
Ak neveríš stiahni si nette, spusť si ladiaci nástroj, uro si 2 objekty jeden bez a druhy so sngleton a potom uvidiš o čom hovorím... Nehovorím ešte o tom že pri kombinácii statickej metódy a singleton môžeš použiť vnorené metódy spusteného objektu prostrenictvom singleton.
Vyskúšj a potom píš...

0 0 Neo 24.2.2012 16:27:58
@Milan Vodicka
Ak potrebujem jednu instanciu tak si vytvorim jednu instanciu , nikto mi dalsiu nanucovat nebude :-) nato Singleton netreba

@Marek Gura
Chlape, tvoj clanok je uplne zly a ked si zato dostal opravnenu kritiku tak si sem skopcil daky kod z php.net
To hovori za vsetko.
0 0 Marek Gura 24.2.2012 13:04:51
Milan, ďakujem za kritiku, budem vedieť aspoň lepšie popisovať anú problematiku. Som za objektívnu oponentúru. Som rád, že niekto objektívne zhodnotil tento článok a spravil som v ňom korekčné opravy.Sľubuje, že sa budem veci snažiť lepšie rozpísať a opísať lepšie danú problematiku. Tento článok som vydal na základe skúseností, s ktorými sa stretávam pri preberaní projektov po low end developeroch alebo po hight end developeroch. V 40% projektoch bola kolíznosť v OOP len kôli tomu, že programátori neboli dostatočne dôsledný k danej problematike a neukončovali bez procesu tried a boli tzv. čakačke na volanie metody danej triedy, popritom už developer ukončil výkon kódu. O túto problematiku sa opiera môj článok a uznávam, že som ho mohol lepšie rozpísať. Napravím to v ďaľšiom článku v OOP PHP a začnem popisovať články od úplného využiťia OOP pre začiatočníkov. Milan prajem ti pekný deň a budem rád keď nebudeme len oponenti :P ale aj oponentúru treba.Aspoň sa zdokonalým v písaní člankov :)
0 0 Milan Vodička 24.2.2012 10:20:30
Marek ... je mi jasne, ze singleton ma svoje vyuzitie tam kde ma zmysel a teda tam kde je v ramci oop modelovania nezmysel tvorit viacero instancii. Ja som nenarazal na samotny fakt, ale na formulaciu a kvalitu clanku. Na to, ze to podla mojho skromneho nazoru nie je vhodny ani pre zaciatocnikov ani pre pokrocilych. Chcel som tym povedat, ze clanok by mal mat lepsie priklady, a mal by byt trochu obsirnejsi ... bez ohladu na to co robi alebo nerobi Zend. Neo: mozno nemam pravdu, myslim si vsak, ze na miestach kde potrebujem jednoduchu triedu, ktora vo svojej podstate nikdy nebude potrebovat viac ako jednu instanciu tak skratka pouzijem singleton. I ked sa to na druhej strane tazko testuje ...
0 0 Marek Gura 23.2.2012 19:47:08
Chlape, na toto musim proste reagovat. Singleton je sposob jedinecneho vyuzitia objektu.pouzivany aj v inych OOP jazykoch a velmi casto vyuzivanych.Singleton je samostatne riesienie oop modelovania.a je uplne jedno ako sa zend postavil k optimalizacii php enginu a jeho roznych urychlovacov ako su zend opt. Zend framework tak isto vyuziva singleton, Nette tak isto... Cize je lahke kritizovat. Poradim chod na php.net a precitaj si na co sa pouziva singleton a jeho vyuzitie.
0 0 Neo 23.2.2012 15:25:34
1) Toto nie je Singleton.
2) Singleton je uz dnes povazovany za anti-pattern , co si uz uvdeomili aj vyvojari Zend Frameworku(konecne) a preto novy Zend 2.0 bude vyuzivat co najmenej Singelton a podobne ako Symfony bude klast vacsi doraz na Dependency injection .
3) To v akej firme pracujes ma nezaujima
Zajtra.sk > Programovanie > PHP > OOP PHP a ich tajné zákutia. 1. diel ako riadime beh naších inštancíi


Kritika

Vieš ako robiť veci lepšie? Pomôž našim odvážnejším členom a skritizuj im projekty!

Reklama

Seriály zo Zajtra.sk

Reklama