2011-08-16 7 views
0

Je n'arrive pas à comprendre le code pour fonctionner? Je ne sais pas pourquoi? Est-ce même possible?Surcharge de méthode et héritage de classe

Je veux toujours appeler une classe par défaut et ses méthodes. Mais en réalité en fonction du paramètre donné. Je veux charger des méthodes de ce client specifiec?

<?php 
#System Defaults 
namespace DefaultNameSpace; 

class defaultClass{ 

    private $property; 

    public function __construct($cusotmer) 
    { 
     if (isset($cusotmer)){ 
      $namespace = '\Customer' . $cusotmer .'Namespace\defaultClass'; 
      # create new dynamic object 
      return new $namespace(); 
     } else { 
      return $this; 
     } 

    } 
    public function printInvoice(){ 
     echo 'Default Print'; 
    } 
    public function createInvoice($invoice){} 
} 

#Customer One defaults 
namespace CustomerOneNamespace; 

class defaultClass extends \DefaultNameSpace\defaultClass { 

    private $property; 

    public function __construct() 
    { 
     return $this; 
    } 
    public function printInvoice(){ 
     echo 'Customer One'; 
    } 
    public function createInvoice ($invoice){ 
     echo 'Create invoice Customer One '.$invoice; 
    } 
} 
# Customer Two Defaults 
namespace CustomerTwoNamespace; 

class defaultClass extends \DefaultNameSpace\defaultClass { 

    private $property; 

    public function __construct() 
    { 
     return $this; 
    } 
    public function printInvoice(){ 
     echo 'Customer Two'; 
    } 
} 
# Call alsways default Class 
$test = new \DefaultNameSpace\defaultClass('Two'); 
$test->printInvoice(); 
$test->createInvoice('123456'); 

?> 
+1

Le constructeur ne peut rien retourner. –

Répondre

3

Vous ne pouvez pas créer un objet de classe descendant lors de l'appel du constructeur de la classe ancêtre, ce code ne fonctionnera donc pas comme vous le souhaitez.

$test = new \DefaultNameSpace\defaultClass('Two'); 

Pour obtenir ce que vous voulez, vous pouvez utiliser Factorypattern. Simplifié (et très primitive) exemple:

function factoryMethod($type){ 
    $result = null; 
    switch($type){ 
     case 1: 
      $result = new Class1(); 
      break; 
     case 2: 
      $result = new Class2(); 
      break; 
     default: 
      $result = new ClassDefault(); 
      break; 
    } 
    return $result; 
} 

$obj = factoryMethod(2); 
$obj->printInvoice(); 

Notez que vous êtes entièrement responsable de retour de factoryMethod objets qui implémentent l'interface nécessaires, comme PHP ne supporte pas le type hinting de retour (pour autant que je sache).

+0

Hmmm, je connais cette option. Mais cela signifie que je dois coder en dur l'espace de noms et les clients dans mes Classes par défaut. si nous pouvions le faire dynamiquement ce serait génial, cela signifie que si un client quitte je ne dois pas aller dans mon code pour le supprimer. Je dois seulement enlever son dossier et j'ai fini, l'espace de noms représentera la structure de dossier. –

+0

Je pense que vous avez une approche étrange dans la conception ... Vous avez juste quelques clients avec des différences majeures dans la logique des affaires pour chacun d'eux? Ne pensez-vous pas qu'il est préférable d'avoir un «client» unique et de distinguer les clients par leurs «ID» par exemple? – J0HN

Questions connexes