2009-12-15 59 views
25

相当直接的问题。在C++中,父构造函数将在子构造函数之前隐式调用,那么PHP有什么逻辑不要这样做?为什么PHP不会自动调用父构造函数?

编辑:我已经从卢克曼得到了一个很好的答案,但我希望更多的原因为什么有差异。也许这个问题应该是为什么C++不允许自定义调用父构造函数?我想这是另一个问题。

+2

是的,我明白了!我确定语言的差异影响了决定是否打电话给家长 - 我想知道原因。 – Skilldrick 2009-12-15 10:28:55

+8

这有点像说“为什么狗不嘎嘎?”:“因为他们不是鸭子。” – Skilldrick 2009-12-15 10:30:03

+0

2Skilldrick:看起来像这是问题的答案:) – ep3static 2009-12-15 11:15:20

回答

24

我认为这是PHP让你手动调用父类的构造,一件好事,因为它可以让孩子的构造如以下几点:

public function __construct() { 
    // set up variables that parent::__construct() requires 
    $var1 = get_stuff_from_db(); 
    $var2 = get_stuff_from_webservice(); 

    parent::__construct($var1, $var2); 

    // continue setting up $this var 
    $this->default = 'Default'; 
    $this->do_some_secret_stuff(); 
} 

甚至:

public function __construct($param) { 
    // call differently based on condition 
    if (is_array($param)) 
     $param['id'] = 0; 
     parent::__construct($param); 
    } 
    else { 
     parent::__construct($param, 0, TRUE); 
    } 

    // continue setting up $this var 
    $this->default = 'Default'; 
    $this->do_some_secret_stuff(); 
} 

含义,你是自由的在孩子的任何地方调用父构造函数,并且可以在调用之前和之后自由地做些事情。这确实不是一个功能吗?

+0

请注意,只有在构造函数体未包含对其的显式调用时,才能自动调用父构造函数。 – putgeminmouth 2011-01-06 07:37:55

+1

需要子类在初始化之前进行初始化的基类...:O我强烈建议在该场景中的任何人重新考虑其应用程序设计。再说一遍,PHP的潜在混杂因素没有限制。 – developerbmw 2015-06-15 22:05:22

+0

这很糟糕,因为在实例化对象时总是应该调用构造函数。通过继承循环,继承的对象类型被实例化,并且还有一个标志,说明构造函数不应该被触发。这违反了一般构造规则并导致混淆(证明在OP中)。另一方面,像C#或C++这样的语言允许隐式地要求构造函数延迟执行,而不是破坏在实例化时调用的构造函数的默认规则。这是PHP的一个非常愚蠢的部分,应该解决。 – Jimmyt1988 2016-07-28 17:24:55

1

避免紧耦合的,这就是为什么继承(扩展Java中的关键字)是邪恶和接口类是首选看JavaWorld的文章: http://www.javaworld.com/javaworld/jw-08-2003/jw-0801-toolbox.html

不过这将是巨大的,如果有一些指令调用父在某指向一个像forward这样的特殊关键字,但是我还没有看到任何语言(甚至Rebol)的这一点,除了由Paul Allen(是微软的联合创始人)发明的未知语言,即Openscript。

+0

调用父母的方法?很多OOP语言都有。像PHP中的'parent'前缀,Python中的super()',Java中的'super'以及甚至在C++中使用父类名称,比如'BaseClass :: method()'。 – Lukman 2009-12-21 16:01:50

+0

所有OOP都有这是OOP的一部分:)。这并不意味着你应该过度使用它。 – 2009-12-25 19:49:41

+0

继承是邪恶的?什么?所以你说,蛇和长颈鹿是动物的事实,你不应该继承任何动物类的属性,而是......什么?创建一个接口,该接口具有一个表示指向动物的指针的方法?什么?这是甚么正确的?啧。不要让我接触到说“多重继承不应该存在”的人,有真实存在的情况下,它是合乎逻辑的。它们是罕见的情况,但它们确实存在。 – Jimmyt1988 2016-07-31 01:34:49

7

当您在子类中没有构造函数时,父类会自动调用。

如果您决定向子类添加构造函数,那么您当然需要显式调用父构造函数。如果您已经花时间为您的子类添加构造函数,那么再添加一行代码parent::__construct();似乎不是什么大问题。但最重要的是一个方便的灵活性。

+3

PHP是唯一可以称为“方便的灵活性”的糟糕设计的语言:D – developerbmw 2015-06-15 22:07:25

+1

不确定你在这里说什么?我认为只有一个构造函数负责让对象进入有效状态才是更好的设计。通过混合儿童和父母的构造函数,我会说有更多的要跟踪。否则,不要创建一个子构造函数。所以PHP很方便地鼓励使用一个构造函数。 – prograhammer 2015-06-16 15:24:02

+1

@Brett你在说什么样的坏设计;谨慎解释? – Kyslik 2015-09-03 11:15:01

相关问题