[PHP] variabele class static method aanroepen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • dragontje124
  • Registratie: Mei 2009
  • Laatst online: 07-09 17:50
Hey
ik ben al een tijdje bezig met het leren van OOP programmeren in PHP.
Ik ben nu bezig met het maken van een factory class. met behulp van deze factory class wil ik een database class aan roepen (dmv singleton pattern). Het probleem is dat de database class die ik wil gebruiken opgeslagen is in een config class. Dat resulteert in de volgende code:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Factory
{
    
    public static function GetConfig()  {
        $config = new Config;   
        return $config;
    }
    
    public static function GetDb()  {
        $config = self::GetConfig();
        if(class_exists($config->dbtype) AND in_array("Database", class_implements($config->dbtype)))   {// bestaat de class waarvan de naam is opgegeven als database type en implementeerd deze de interface Database?            
            $db = $config->dbtype::Get();           
        }
        else    {   //nee?? gebruik MySQL
            $db = MySQL::Get();
        }
        
        return $db;
    }
    
    
    
}

het probleem is dat het volgende stukje code niet op PHP lager dan 5.3.0 werkt:
PHP:
1
$db = $config->dbtype::Get();

weet iemand of hier een workaround voor is?
ik heb het volgende ook al geprobeert maar ook dat werkt niet:
PHP:
1
2
$db = new $config->dbtype;
$db = $db::Get();

hier meer info @ php.net (example 1)

Acties:
  • 0 Henk 'm!

  • OnTracK
  • Registratie: Oktober 2002
  • Laatst online: 23:12
PHP:
1
$db = call_user_func(array($config->dbtype, 'Get'));

[ Voor 10% gewijzigd door OnTracK op 27-12-2009 23:00 ]

Not everybody wins, and certainly not everybody wins all the time.
But once you get into your boat, push off and tie into your shoes.
Then you have indeed won far more than those who have never tried.


Acties:
  • 0 Henk 'm!

  • dragontje124
  • Registratie: Mei 2009
  • Laatst online: 07-09 17:50
OnTracK schreef op zondag 27 december 2009 @ 22:59:
PHP:
1
$db = call_user_func(array($config->dbtype, 'Get'));
het werkt :)
bedankt!

Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 16-09 15:46

MBV

wat heb je al aan debugging gedaan? staat er echt iets in $config->dbtype? Werkt het wel als je <iets>::Get(); ergens neerzet?

En weet je zeker dat je iets doet met singleton? GetConfig() en GetDb() werken allebei niet als singleton in dit voorbeeld.

Acties:
  • 0 Henk 'm!

  • dragontje124
  • Registratie: Mei 2009
  • Laatst online: 07-09 17:50
MBV schreef op zondag 27 december 2009 @ 23:07:
wat heb je al aan debugging gedaan? staat er echt iets in $config->dbtype? Werkt het wel als je <iets>::Get(); ergens neerzet?

En weet je zeker dat je iets doet met singleton? GetConfig() en GetDb() werken allebei niet als singleton in dit voorbeeld.
ik weet zeker dat alles klopt, het is gewoon iets wat pas na PHP 5.3.0 geïmplementeerd is.
hier @ php.net http://php.net/manual/en/language.oop5.static.php leggen ze uit dat dit pas vanaf PHP 5.3.0 werkt (die ik niet heb), ik kreeg dan ook deze error :
syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in *snip* on line 14

de database class zelf (in dit geval MySQL) werkt als een singleton ;), dat heb ik inderdaad een beetje vaag uitgelegd.

[ Voor 15% gewijzigd door dragontje124 op 27-12-2009 23:10 ]