2017-07-06 92 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"); 
    } 
} 

现在调用它。