7

拥有一个任何代码都可以访问的主类,一些代码可以类似,但具有加载动态类的最佳实践吗?

候选代码:

static public function __callStatic($mtd,$arg){

    // using spl_autoload_register()
    $class = '\\framework\\libs\\'.$mtd;  

    $inst = new $class($arg);

}

句法:

main::dinamicu($data);
4

2 回答 2

2

对于这种情况,我使用控制反转容器。

我从一个门面类开始:

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

通过使用这种方法,我可以完全自由地实现我的依赖注入容器。我可以以任何方式更改它,而不会破坏我的应用程序中的代码。

只需创建一个新容器,我就可以在没有任何静态参数的情况下测试容器。

于 2012-09-02T17:58:29.460 回答
0

我的两分钱:

由于您提到了“最佳实践”,假设您正在谈论类似于服务定位器模式(这是您的main::dinamicu($data);)的东西,当假设是测试驱动开发时,有些人会认为这不是一个好的模式。最好是依赖注入容器,而不是服务定位器。

在某些方面类似于工厂类,容器将负责类的实例化。要清楚地了解并查看有关如何处理对象创建的示例,请参阅下面的示例(Symfony 服务容器):

http://fabien.potencier.org/article/13/introduction-to-the-symfony-service-container

(symfony 服务容器,尽管采用了依赖注入容器,但它仍然用作控制器上的服务定位器,如您发布的代码中所示)

于 2012-08-13T11:18:52.573 回答