2017-07-06 77 views
0

我有一個Base類具有一些基本功能和一些輔助方法。我想從這個類擴展不同的方法,超過10個。所以我會有class Foo extends Baseclass Bar extends Base等等。現在就調用這些方法而言,應用程序僅根據環境運行這些擴展中的一個,因此例如生產new Foo()被調用並且開發new Bar()被調用。動態類選擇通過ENV變量

我對這些有一些基本的功能,但恐怕它不會擴展和/或它不是最好的辦法。我有一個名爲CLASS_LOAD='bar'的ENV變量。這是我的代碼和我是如何做它至今:

class Base { 
    // 
} 

class Foo extends Base { 
    // 
} 

class Bar extends Base { 
    // 
} 

class ClassLoader { 
    public static function init() { 
     switch (getenv('CLASS_LOAD')) { 
      case 'bar': 
       return new Bar(); 
      case 'foo': 
       return new Foo(); 
      default: 
       throw new Exception(); 
     } 
    } 
} 

而且我在應用程序中調用這個方法是:

$class = ClassLoader::init(); 

這工作得很好,現在我想,但我會每次添加Base類的新擴展時,都要不斷更新ClassLoader類。並且可能在未來,開關盒聲明將變得難以忍受。

我可以做點別的嗎? 任何想法?

感謝

+0

我有一個想法,你應該將類名傳遞給init函數參數,並通過一些方法創建它的實例並使用這個實例,這樣你就不需要switch語句。 – sagar

回答

0

我想你應該嘗試這種做法,將不再需要switch語句,你不必再恐慌。

class ClassLoader{ 
    public static function init() { 
     $class = getenv('CLASS_LOAD'); 
     if(class_exsists($class)) 
     return new $class; 
     else 
     throw new Exception("class not found"); 
    } 
} 

現在調用它。