gpt4 book ai didi

PHP 类 - 全局或 __construct

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

所以我遇到了 PHP 类的“问题”。

我有几个类需要彼此的函数,所以目前我正在做以下事情:

$db = new blueConnect;
$core = new blueCore($db);
$users = new blueUsers($db, $core);

然后在文件中:

public function __construct(blueConnect $db, blueCore $core) {
$this->db = $db;
$this->core = $core;
}

但是,与其对每个需要额外功能的文件都这样做,不如写成

global $db, $core

在每个需要它的功能中?

最佳答案

您所说的模式名称简称为“Dependency Injection”或DI

根据您的项目,使用 global 可能会在短期内解决问题,但如果您计划创建一个大型项目,稍后进行测试并与多人共享,您可能希望完全避免使用 global。 - 你无法很好地测试或调试那些东西

一个(不好的)解决方案是让你的数据库和核心类使用单例模式来避免全局但具有相同的效果。 (不可测试,不可配置)

public function __construct() {
$this->db = blueConnect::getInstance();
$this->core = blueCore::getInstance();
}

这个问题的解决方案通常是创建一个工厂函数,它创建所有需要数据库和核心的服务

public function createService($name) {
$serviceClass = 'blue'.ucfirst($name).'Service';
return new $serviceClass($this->getDatabase(), $this->getCore());
}

这个函数通常是Registry 的一部分,或者更好的是 DI Container,例如 PIMPLE

每个服务只有一个实例的示例:

public function createService($name) {
$serviceClass = 'blue'.ucfirst($name).'Service';

static $services = array();
if(!isset($services[$name])) {
$services[$name] = new $serviceClass($this->getDatabase(), $this->getCore());
}

return $services[$name];
}

请注意,您不应使用您的注册表/DI 容器进行测试,因为您的容器内有一个“全局”状态。 (例如,两次获取相同的服务)

关于PHP 类 - 全局或 __construct,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29819257/

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