php - 如何在 PHP 7 中的另一个类中使用一个类的实例
问题描述
我有一个看似简单的查询,但我在其他地方没有找到答案。我有 2 个类,一个称为 DB,它本质上连接到数据库,然后可以运行查询。我在文档顶部实例化它 $db= new DB; 然后我可以在整个页面中对数据库运行一系列查询。我遇到的问题是我想在另一个名为 User 的类中使用这个实例。我知道我可以再次实例化,但这没有意义,或者在实例化用户时传递数据库实例,例如 $user = new User($db); 但是考虑到 $db 实例将被我要创建的大多数类使用,我认为有更好的解决方案可以将其导入其他类。我查看了全球路线,但我读到这是不好的做法 + 我遇到了意外的全球错误
class User{
global $db;
public function __construct()
{
var_dump($this-> db);
}//end constructor
}//end class
解决方案
由于您的数据库客户端将被实例化一次,然后在其他任何地方使用,我最初的想法是建议将其作为构造函数参数(依赖注入)传递,但由于您不喜欢这种方法,我建议您将数据库客户端设置为单例类,这意味着它只能被实例化一次,并且任何后续尝试都会在任何地方返回相同的实例。
您可以在创建 PHP5 中的单例设计模式中查看有关 PHP 中单例类的详细响应。
举个简单的例子,您的数据库看起来与此类似:
final class DB
{
public static function getInstance()
{
static $inst = null;
if ($inst === null) {
$inst = new self();
}
return $inst;
}
private function __construct()
{
// your code here ...
}
// your code here ...
}
然后,在您的 User 类上,您将获得 DB 类实例:
class User {
// your code here ...
public function doSomething() {
$db = DB::getInstance();
// your code here ...
}
}
推荐阅读
- twilio - Twilio.Api 版本 3.4.1.0 中 TwilioClient.Init() 的替代方法是什么
- blazor - 我们可以在 Web 浏览器中运行 Mobile Blazor Bindings 项目吗?
- mysql - 使用 NodeJS、Mysql、React 应用程序将未定义的值传递给 INSERT 语句
- spring-boot - KafkaHandler 从列表中消失
在 org/springframework/kafka/listener/adapter/DelegatingInvocableHandler.java - c# - 如何使用 .Net Framework 4.8(非核心)和 Authenticator=ExternalBrowser 连接到雪花
- reactjs - Reactjs 日期选择器
- c - 解析 C 字符串并使用字符串中的值设置变量
- javascript - 无法读取角度未定义的属性“集合”
- javascript - 谁能告诉我为什么我的代码不能正常工作?游戏石头、纸、剪刀。Java 脚本
- c# - 如何在 C# 表单应用程序本身中存储启动凭据?