我阅读the following article并对“动态类实例化”部分感到非常困惑。特别是这段代码:
$obj = new $className();
if (!$obj instanceof SomeBaseType) {
throw new \InvalidTypeException();
}
我不明白这实际上是为你做了什么。如果它不是基类的实例,则会出错。这有什么用?它没有获得正确类型的实例,或者根据当前类型执行不同的操作,它只是抛出异常。我无法概念化此代码的目的,而且文章并没有真正为我清除它。
---------文章----------
的完整部分“动态类实例化
一般来说,以下代码虽然合法,但应该很少使用,并且只有在其他可能的实例化模式用尽时才会使用:
$obj = new $className();
if (!$obj instanceof SomeBaseType) {
throw new \InvalidTypeException();
}
为什么这是一个糟糕的模式?首先,它预先假设构造函数签名没有任何必需的参数。虽然这对于此工厂已知的对象类型很有用,但对于所讨论的基础对象的使用者子类型可能并非总是如此。永远不要在具有依赖关系的对象上使用此模式,或者在可以想象子类型可能具有依赖关系的情况下,因为这会消除子类型练习构造函数注入的可能性。
另一个问题是,除了管理对象或对象列表之外,您现在还在管理类名或类名列表以及对象或对象列表。相反,人们可以简单地管理对象。
另一方面,如果您知道这个特定的对象类型只是一个值对象(或类似对象),并且不需要它在子类型中需要依赖,那么您可以谨慎地使用这个实例化模式。“ p>