gpt4 book ai didi

php - 有没有办法在调用构造函数之前设置属性?

转载 作者:行者123 更新时间:2023-12-03 23:25:28 26 4
gpt4 key购买 nike

是的,我知道依赖项应该传递给构造函数。我不是在询问编码风格或做什么和不做什么。

我的应用程序中的许多类都与数据库驱动程序类的实例相关联。为此,我使用 PHP 的后期静态绑定(bind)创建了一个抽象工厂类。此类的唯一成员是保存驱动程序引用的属性。它看起来像这样:

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 上工作。

对于那些认为这是不可能的人, It can easily be done in PHP 5.4使用 ReflectionClass::newInstanceWithoutConstructor() .

最佳答案

class Foo {
public function __construct() {
echo 'foo';
}
}

$r = new ReflectionClass('Foo');
$o = $r->newInstanceWithoutConstructor();
$o->bar = 'baz';
$o->__construct();

从 PHP 5.4 开始,这是可能的。

但实际上:没有。就是不行。不。 实例化对象时,应始终调用对象的构造函数。不早(显然),不晚。构造函数和对象其余部分的适当封装保证对象始终处于一致状态。一旦你开始使用 ReflectionClass 将其拆开无法再对对象的状态做出任何保证,并且理智和类型安全都被抛在了脑后。

既然你在 5.3 上,你很幸运那里没有办法做到这一点。如果你发现自己陷入了这样的困境,那你只是做错了。已经编写了非常复杂的程序,而无需欺骗 PHP 的对象模型来延迟构造函数调用。

关于php - 有没有办法在调用构造函数之前设置属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23428656/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com