gpt4 book ai didi

php - 如何避免将我的 $registry 容器手动传递到我创建的每个新类的构造函数中?

转载 作者:行者123 更新时间:2023-12-04 03:19:37 25 4
gpt4 key购买 nike

我已经使用 MVC 几个月了,我将所有内容都存储在我的 $registry 对象中。当我创建一个新类时,我通常只传递注册表,但在创建新类时我不得不不断地传递 $this->registry

例如

class something
{
public function __construct($registry)
{
$this->registry = registry;
$this->db = $registry->db;
$this->user = $registry->user; // ......
}

public function something()
{
$class = new something_class($this->registry);
$class->do();
}
}

class something_class
{
public function __construct($registry)
{
$this->registry = $registry;
}

public function do()
{
echo 'Doing something ....';
}
}

我的问题是,如何在注册表类中以某种方式处理将注册表传递给幕后的新类(在本例中是在实例化 something_class 时)?我绝对相信有一种简单的方法可以做到这一点,但我找不到任何与我正在寻找的东西相关的东西。

这是我的注册表类:

<?php
class registry
{
protected $vars = array();
public function &__set($index, $value)
{
$this->vars[$index] = $value;
return $value;
}

public function &__get($index)
{
return $this->vars[$index];
}
}

最佳答案

这都是错的。 “注册表”是一种反模式,您正在做的是不是依赖注入(inject)。你已经找到了一种伪造全局变量的方法..就是这样。

作为开始,请观看this lecture .

至于如何正确的做你想做的,有两种方式:

  • 使用一个工厂,它使用您提供的依赖项创建一个类
  • 使用依赖注入(inject)容器,Auryn

要了解如何使用 DI 容器,您只需查阅文档即可。但我会解释工厂的基础知识,这更像是一种 DIY 方法

工厂是一个对象,负责初始化其他类。例如,您有一大组类,它们需要 PDO 作为依赖项。

class Factory 
{
private $pdo;

public function __construct(PDO $pdo) {
$this->pdo = $pdo;
}


public function create($name) {
return new $name($this->pdo);
}
}

如果您使用此类的实例,它会让您创建对象,这些对象的 PDO 已经作为依赖项传递到构造函数中:

$factory = new Factory(PDO($dsn, $user, $pass));
$user = $factory->create('User');
$document = $factory->create('Doc');

作为一个额外的好处,此设置将使机器人 User 类实例和 Doc 类实例共享相同的 PDO 对象。

关于php - 如何避免将我的 $registry 容器手动传递到我创建的每个新类的构造函数中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39246777/

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