Primjer singletona

Ne mogu skuziti ovaj singleton pattern… Mucim se vec dugo s tim i nikako da skuzim…

Imam klasu Base, koju extendaju sve ostale klase:
[php]class Base
{
private static $_instance;

public static function get_instance() 
{
    if ( ! ( self::$_instance instanceof self ) )
    {
        self::$_instance = new self();
    }

    return self::$_instance;
}

}[/php]

Imam klasu Loader, koja u konstruktoru ima:
[php]class Loader extends Base
{
public function __construct()
{
foreach($this->_folders as $folder)
{
$this->_load($folder.’/’); // includa sve kontrolere, modele i library fajlove
}

   Base::get_instance();
}

}[/php]

I nista se nedogada, kao da nije instancirano… Moze li mi neko pomoci kako da instanciram klasu pomocu singletona? :frowning:

pomoc :frowning:

Evo imaš tu
http://php.net/manual/en/language.oop5.patterns.php
singleton pattern ali i neke druge.
U tvojem primjeru radiš extends na klasu koju kasnije pozivaš i još pri toj klasi na koju radiš extends koristiš Singleton desing pattern što nema smisla.

Mislim da kad koristiš Singleton desing pattern na tu klasu se ne radi extend što i ima nekog smisla, ako se uzme da je kod Singleton desing pattern konstruktor privatan ili se to simulira da bude privatan.
Neznam možda griješim.:gitara:

Extend sam maknio, popravio sam kod iz klase, ali i dalje se loader ne instancira. Znam po tome što u konstruktoru ima funkciju za automatsko loadanje svih potrebnih fajlova…

[php]
// klasa Loader
public function __construct()
{
Base::get_instance();

	foreach($this->_folders as $folder)
	{
        $this->_load($folder.'/');
    }
}

// klasa Base
class Base
{
protected static $instance;

private function __construct() {}
private function __clone() {}

public static function get_instance()
{
    if ( ! isset(self::$instance))
    {
        self::$instance = new self();
    }
    
    return self::$instance;
}

}

// index.php
require_once(SYSPATH.‘core/Base.php’);
require_once(SYSPATH.‘libs/Loader.php’);
Dispatcher::dispatch();

// javlja mi: class dispatcher does not exists. a i u njemu je get_instance()[/php]

Što uopće ovo radi Base::get_instance(); Vraća instancu i onda što?
A zašto bi se loader instancirao, gdje ga instanciraš?

Pa u tom je problem, sto je svagdje drukciji kod za singleton. Loader se samo instancira, kad je instanciran konstruktor zove ostalo, ali i zelim da SVE ostale klase imaju pristup Loaderu (i Base zbog instanciranja). + hocu da se Loader instancira cim je includan… Izvedivo? :o

Kod za singelton pattern ti je svagdje isti, zato se i zove design pattern, jer da je svagdje drugačiji ne bi bio ni pattern, a kamoli design pattren.

Evo ti ovako, možda ti bude jasnije:

http://articles.sitepoint.com/article/coming-soon-webserver-near/9

P.S.: Inače se prema nekima korištenje Singelton klase u PHP, ali i u drugim “web jezicima” ne preporuča, odnosno kaže se da nema smisla koristiti s obzirom na to da je web stateless, a s obzirom da ti je CodeIgniter predložak po kojem razvijaš svoj framework pogledaj tamo i vidjet ćeš da imaš nekakvu emulaciju Singleton klase ali nikako onu pravu implementaciju te iste.

P.S.S.: Evo još malo o design patternima:

http://www.tonymarston.net/php-mysql/singleton.html

http://www.fluffycat.com/PHP-Design-Patterns/

A sve je moguće samo je pitanje koliko bi smisla imalo odnosno koliko je kvalitetno da su sve klase u aplikaciji povezane. To se krši sa osnovama dobrog OOP dizajna. Loose coupling.