2010-05-06 4 views
0

Je souhaite qu'une propriété de classe fasse référence à une autre classe, et non à son objet, puis utilise cette propriété pour appeler les méthodes statiques de la classe.composition de classe au lieu de la composition de l'objet?

class Database { 
    private static $log; 

    public static function addLog($LogClass) { 
     self::$log = $LogClass; 
    } 

    public static function log() { 
     self::$log::write(); // seems not possible to write it like this 
    } 
} 

des suggestions comment je peux accomplir cela?

parce que je n'ai aucune raison d'en faire des objets, je veux utiliser les classes pour cela.

Répondre

1

Puisque vous êtes apparemment seulement intéressé par une méthode/fonction spécifique (sans autres contrats/interfaces) vous pouvez écrire le code d'une manière qu'il n'a pas d'importance que ce soit une méthode statique ou une méthode objet (... hm, méthode objet ... qui ne sonne pas bien, quel est le bon nom ...) ou une fonction simple.

class LogDummy { 
    public static function write($s) { 
    echo 'LogDummy::write: ', $s, "\n"; 
    } 
    public function writeMe($s) { 
    echo 'LogDummy->writeMe: ', $s, "\n"; 
    } 
} 

class Database { 
    private static $log=null; 

    public static function setLog($fnLog) { 
    self::$log = $fnLog; 
    } 

    public static function log($s) { 
    call_user_func_array(self::$log, array($s)); 
    } 
} 

// static method 
Database::setLog(array('LogDummy', 'write')); 
Database::log('foo'); 

// member method 
$l = new LogDummy; 
Database::setLog(array($l, 'writeMe')); 
Database::log('bar'); 

// plain old function 
function dummylog($s) { 
    echo 'dummylog: ', $s, "\n"; 
} 
Database::setLog('dummylog'); 
Database::log('baz'); 

// anonymous function 
Database::setLog(function($s) { 
    echo 'anonymous: ', $s, "\n"; 
}); 
Database::log('ham'); 

impressions

LogDummy::write: foo 
LogDummy->writeMe: bar 
dummylog: baz 
anonymous: ham 
+0

méthode objet semble bien pour moi, mais vous pouvez l'appeler une méthode d'instance, aussi – Gordon

2

Utilisez la fonction call_user_func:

class Logger { 
    public static function write($string) { 
     echo $string; 
    } 
} 

class Database { 
    private static $log; 

    public static function addLog($LogClass) { 
     self::$log = $LogClass; 
    } 

    public static function log($string) { 
     call_user_func(array(self::$log, 'write'), $string); 
    } 
} 

$db = new Database(); 
$db->addLog('Logger'); 
$db->log('Hello world!');