2011-08-16 9 views
0

動作する理解コードが得られませんか?どうしてか分かりません?それも可能ですか?メソッドのオーバーロードとクラスの継承

私はいつもデフォルトのクラスとそのメソッドを呼び出したいと思います。しかし実際にはパラメータに依存します。私はその特定の顧客からメソッドをロードしたいですか?

<?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

コンストラクターは何も返しません。 –

答えて

3

祖先クラスのコンストラクタを呼び出すときにdescendatntクラスのオブジェクトを作成することはできません。したがって、このコードは必要に応じて機能しません。あなたはFactorypatternを使用することができます欲しいものを達成するために

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

。簡素化された(と非常に原始的な)例:

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(); 

注意PHPは(私の知る限り)戻り値の型のヒンティングをサポートしていないとあなたが、必要なインターフェイスを実装factoryMethodオブジェクトからの復帰完全に責任を負うこと。

+0

Hmmm、私はこのオプションを知っています。しかし、これは、私がデフォルトのクラスで名前空間と顧客をハードコードする必要があることを意味します。私たちが動的にすることができれば、これは素晴らしいことです。これは、顧客が私のコードを削除する必要はありません。私は彼のフォルダを削除する必要があり、私は完了です、名前空間は、フォルダ構造を表します。 –

+0

私はあなたがデザインに奇妙なアプローチをしていると思います...それぞれのビジネスロジックに大きな違いがある顧客はほんの少しですか?あなたは「顧客」という単一のクラスを持ち、顧客を「ID」で区別する方が良いと思いませんか? – J0HN

関連する問題