可以存在一种在 php 加载动态类的最佳实践/方法


Can exist a best practice/way to load dynamic class at php?

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

候选人代码:

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服务容器,在采用依赖注入容器的吐槽中,它仍然用作控制器上的服务定位器,就像你发布的代码一样)