我回答了一个问题(链接),我在另一个类的构造函数中使用了新对象的创建,这里是示例:
class Person {
public $mother_language;
function __construct(){ // just to initialize $mother_language
$this->mother_language = new Language('English');
}
我得到了用户“Matija”(他的个人资料)的评论,他写道:你永远不应该在对象构造函数中实例化一个新对象,依赖关系应该从外部推送,所以任何使用这个类的人都知道这个类依赖什么!
一般来说,我可以同意这一点,我理解他的观点。
但是,我以前经常这样做,例如:
- 作为私有属性,其他类为我提供了无需复制代码即可解决的功能,例如,我可以创建一个
ArrayAccess
对象列表(类实现接口),并且此类将用于另一个具有此类列表的类对象, - 一些类使用例如
DateTime
对象, - 如果我
include
(或自动加载)依赖类,一个应该没有错误的问题, 因为依赖对象可能非常大,将它们全部传递给类构造函数可能会很长而且不清楚,例如
$color = new TColor('red'); // do we really need these lines? $vin_number = new TVinNumber('xxx'); $production_date = new TDate(...); ... $my_car = new TCar($color, $vin_number, $production_date, ...............);
因为我是在 Pascal 中“出生”的,然后在 Delphi 中,我从那里就有了一些习惯。在 Delphi(以及 FreePascal 作为其竞争对手)中,这种做法非常常见。例如,有一个
TStrings
类处理字符串数组,并存储它们,它不使用array
s 而是另一个类,TList
,它提供了一些有用的方法,而TStrings
只是某种接口。该TList
对象是私有声明的,除了TStrings
.- (不重要,但出于某种原因)通常我是使用我的课程的人。
请解释一下,避免在构造函数中创建对象真的很重要吗?
我已经阅读了这个讨论,但仍然不清楚。