是的,我知道的依赖应该传递给构造。 我不要求有关的编码风格或做的和不要的。
许多在我的应用程序的类都依赖于数据库驱动程序类的一个实例。 为此,我已经创建了使用PHP的后期静态绑定一个抽象工厂类。 这个类的唯一成员是保持驾驶员的参考属性。 它看起来像这样:
abstract class Factory {
static private $__instances;
static private $__default_driver;
protected $_driver;
static public function getInstance ( \Database\Driver $driver = null ) {
if ( ! isset($driver) ) {
if ( ! isset(self::$__default_driver) ) {
require ( \Core\Options::$database_driver[ 'path' ] );
self::$__default_driver = new \Core\Options::$database_driver[ 'class' ]( \Core\Options::$database_options );
}
$driver = self::$__default_driver;
}
$schema = $driver->getDatabase();
$class = get_called_class();
if ( ! isset(self::$__instances[ $schema ][ $class ]) ) {
self::$__instances[ $schema ][ $class ] = new $class( $driver );
self::$__instances[ $schema ][ $class ]->_driver = $driver;
}
return self::$__instances[ $schema ][ $class ];
}
}
正如你所看到的,当我创建派生类的实例,我通过驱动程序的实例给它的构造。 然后设置该属性。 我想如果可能扭转这种,通过设置属性第一,然后调用构造函数。 这样,派生类并不需要实现一个构造函数或担心调用父方法,如果它。
我已经研究过的Reflection
API来做到这一点,但我似乎无法找到任何会工作。 大多数Dependency Injection
我发现链接实际使用的构造函数。 这需要在PHP 5.3的工作。
对于那些谁是adament,这是不可能的, 它可以很容易地在PHP 5.4完成使用ReflectionClass::newInstanceWithoutConstructor()