拥有一个任何代码都可以访问的主类,一些代码可以类似,但具有加载动态类的最佳实践吗?
候选代码:
static public function __callStatic($mtd,$arg){
// using spl_autoload_register()
$class = '\\framework\\libs\\'.$mtd;
$inst = new $class($arg);
}
句法:
main::dinamicu($data);
对于这种情况,我使用控制反转容器。
我从一个门面类开始:
class IoC
{
private static $container;
public static function Initialize ( IContainer $Container )
{
self::$container = $Container;
}
public static function Resolve( $type, array $parameters = array() )
{
return self::$container->Resolve( $type, $parameters );
}
}
然后,我的引导程序,我用依赖注入容器初始化外观类:
$container = new Container();
$container->Register( 'Logger', function() { return new Logger('somefile.log'); } );
IoC::Initialize ( $container );
然后在我的代码中的某个地方,当我想获取一个对象时:
$log = IoC::Resolve( 'Logger' );
通过使用这种方法,我可以完全自由地实现我的依赖注入容器。我可以以任何方式更改它,而不会破坏我的应用程序中的代码。
只需创建一个新容器,我就可以在没有任何静态参数的情况下测试容器。
我的两分钱:
由于您提到了“最佳实践”,假设您正在谈论类似于服务定位器模式(这是您的main::dinamicu($data);
)的东西,当假设是测试驱动开发时,有些人会认为这不是一个好的模式。最好是依赖注入容器,而不是服务定位器。
在某些方面类似于工厂类,容器将负责类的实例化。要清楚地了解并查看有关如何处理对象创建的示例,请参阅下面的示例(Symfony 服务容器):
http://fabien.potencier.org/article/13/introduction-to-the-symfony-service-container
(symfony 服务容器,尽管采用了依赖注入容器,但它仍然用作控制器上的服务定位器,如您发布的代码中所示)