gpt4 book ai didi

php - 在 __construct 完成后调用方法

转载 作者:可可西里 更新时间:2023-10-31 23:04:22 24 4
gpt4 key购买 nike

基本上我有一个方法,我需要在构造函数完成时运行它(该方法称为 persist() 并且它只是将在构造函数期间生成的 key 保存到 session 中)。这看起来很简单,而且有效——在 __construct 的末尾,我调用了 $this->persist()。

问题是这个类被多次子类化了。这会导致两个问题。

第一,我必须记住在每个子类的 __construct 方法结束时调用 persist()。这不是一个大问题,但感觉不是很 OOP,我觉得我可以在父类中以某种方式处理这个问题,这样会更好。

第二,如果一个子类被子类化(它是),并且 __construct 方法被链接(即调用 parent::__construct),persist() 方法将被触发多次,每次类被子类化。当所有构造完成时,它只需要调用一次。在这种情况下,它并没有真正破坏任何东西,因为当第 2 次、第 3 次等调用 persist 方法时,它只是覆盖之前保留的内容。但这不是重点,因为我只是觉得必须有更好的方法,并且存在不允许多次调用该方法的场景。

构造对象然后调用持久化对象的工厂方法是唯一的方法吗?我可以沿着这条路走下去,但我只是想知道是否有一种方法可以做到这一点,以便始终在构造后调用来自父级的方法。

下面是一些示例代码:

session_start();
is(!isset($_SESSION["Component"])) $_SESSION["Component"] = [];

abstract Class Component
{
private $id;
protected $key;

function __construct($id = NULL)
{
$this->id = $id;
$this->key = [];
$this->key["something"] = "SomeValue";
$this->persist(); // First call
}

protected function persist()
{
if($this->id !== NULL) $_SESSION["Component"][$this->id] = $this->key;
}
}

Class SomeComponent extends Component
{
function __construct($id = NULL)
{
parent::__construct($id);
$this->key["something-else"] = "SomeOtherValue";
$this->persist(); // Second call
}
}

Class SomeSpecialistComponent extends SomeComponent
{
function __construct($id = NULL, $key = [])
{
parent::__construct($id);
$this->key = array_merge($this->key, $key);
$this->persist(); // Third call
}
}

$my_component = new SomeSpecialistComponent(1, ["example" => true]);

最佳答案

我发现获得类似东西的唯一技巧(除了我想在之前而不是之后执行事情)是使用带有抽象方法的父类作为新的构造函数:

abstract class RequireThings {

public function __construct() {
$this->constructAndPersist();
$this->persist();
}

abstract function constructAndPersist();

// You could also set this function in your children classes by the way.
public function persist() {
echo ' Then I persist!';
}


}

class UsingPersist extends RequireThings {

public function constructAndPersist() {
echo 'I do my things first.';
}

}

$class = new UsingPersist();

会输出:

我先做我的事情。那我坚持!

如果我答对了你的问题,应该足以避免你面临的问题。

此解决方案的主要缺点是您必须使用一个新函数,该函数应该是此类类的新构造函数。这就是我将 __constructPersist 设置为抽象的原因,它会强制执行所需的行为。

关于php - 在 __construct 完成后调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29145282/

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