gpt4 book ai didi

php - 最佳实践,覆盖 __construct() 与提供 init() 方法

转载 作者:IT王子 更新时间:2023-10-29 01:19:10 26 4
gpt4 key购买 nike

当您对对象进行子类化并希望扩展初始化代码时,有两种方法。覆盖 __construct(),并实现父类(super class)构造函数调用的初始化方法。

方法一:

class foo
{
public function __construct ($arg1, $arg2, $arg3)
{
// Do initialization
}
}

class bar extends foo
{
public function __construct ($arg1, $arg2, $arg3)
{
parent::__construct ($arg1, $arg2, $arg3);
// Do subclass initialization
}
}

方法二

class foo
{
public function init ()
{
// Dummy function
}

public function __construct ($arg1, $arg2, $arg3)
{
// Do subclass defined initialization
$this -> init ();
// Do other initialization
}
}

class bar extends foo
{
public function init ()
{
// Do subclass initialization
}
}

Zend 框架的文档似乎不鼓励重写构造函数,并希望您重写 init 方法(如果提供),但不知何故,这对我来说并不合适。 Zend 也倾向于做一些我不满意的事情,所以我不确定它是否应该被用作最佳实践的例子。我个人认为第一种方法是正确的,但我经常看到第二种方法,以至于想知道这是否真的是我应该做的。

您对覆盖 __construct 有什么意见吗?我知道你必须小心记住调用父类(super class)构造函数,但大多数程序员应该意识到这一点。

编辑:我没有使用 Zend,我只是将它用作鼓励您使用 init() 而不是覆盖 __construct() 的代码库示例。

最佳答案

看起来第二种方法正在推迟问题。

如果你有一个类:

class bar2 extends bar // which already extends foo
{
public function init()
{
// You should then do anyway:
parent::init();

// ...
}
}

我也会选择第一种方法,更合乎逻辑且更直接,因为 parent::init()parent::__construct() 调用不能无休止地回避。第一种方法 IMO 不那么令人困惑。

关于php - 最佳实践,覆盖 __construct() 与提供 init() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8210561/

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