2011-08-16 71 views
0

我無法理解代碼的工作?我不知道爲什麼?它甚至有可能嗎?方法重載和類繼承

我總是想調用一個默認的類和方法。但實際上取決於參數givven。我想從該特定客戶加載方法?

<?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類的對象,因此此代碼不會按您的需要工作。

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

達到你願意,你可以使用Factorypattern什麼。簡化的(和非常原始的)例子:

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

嗯,我知道這個選項。但這意味着我必須在我的默認類中對命名空間和客戶進行硬編碼。如果我們能夠動態地實現它,那將會很棒,這意味着如果客戶離開,我不必進入我的代碼中刪除它。我只需要刪除他的文件夾,我完成了,命名空間將代表文件夾結構。 –

+0

我認爲你在設計中有一種奇怪的方法......你只有少數客戶在他們每個人的業務邏輯上存在重大差異?難道你不覺得單一的'客戶'更好嗎,並且通過他們的'ID'來區分客戶嗎? – J0HN