2010-12-15 106 views
3

J'ai une classe abstraite pour déplacer des données d'une base de données à une autre, et parfois les données requises pour créer les entrées de base sont différentes, en raison de la présence d'une ancienne table dans la base de données de destination qui comprend des instructions pour localiser les données dans la source. De toute évidence simplifiée, voici où le problème entre en jeu:Signatures de méthodes multiples pour une seule surcharge abstraite/abstraite

abstract class foo 
{ 
    protected abstract function createBaseEntry($id); 
} 

Parfois, je ne ai besoin d'une ID passé à cette fonction, mais dans certains cas, je dois passer deux. Bien sûr, si la signature de la méthode concrète ne correspond pas à la méthode abstraite, PHP déclenchera une erreur fatale et stoppera l'exécution. Autre que de prédéfinir avec null le nombre maximum d'arguments et de modifier chaque classe concrète qui prolonge celui-ci, y a-t-il un moyen de contourner cela?

Répondre

4

Vous pouvez utiliser func_num_args() et func_get_args() pour déterminer le nombre d'arguments lors de l'exécution si vous ne pouvez pas/ne voulez pas change the method signature to have an optional second argument.

Exemple

function foo() 
{ 
    $num = func_num_args(); 
    $args = func_get_args(); 
    var_dump($num, $args); 
} 

foo(1, 2, 3); 

sortie (codepad)

int(3) 
array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } 

Cela fonctionne également quand il y a des arguments définis dans la signature.

+1

Je pense que je vais juste le changer pour accepter un enregistrement, puis laisser chaque implémentation déterminer ce qu'il faut faire de cet enregistrement; cependant, puisque votre suggestion est manifestement correcte, je vais l'accepter et aller de l'avant avec ma vie. Le projet critique dans le temps, ne peut pas tout rattraper sur un détail =) – Dereleased