PHP - 类构造中的Require_once

Posted

技术标签:

【中文标题】PHP - 类构造中的Require_once【英文标题】:PHP - Require_once inside a class construct 【发布时间】:2012-02-25 03:03:14 【问题描述】:

当我使用 require_once 并尝试访问所需文件中的变量时,我收到一个错误,即变量 ($db) 未定义。

我试图将require_once 语句放在几个不同的地方,因为我认为这可能是变量范围的问题,但此时我尝试在构造函数中调用它并将值分配给类变量。

我的配置类:

class Config 

    public $db;

    public function __construct() 
        require_once (BASE_DIR."config/DBConfig.php");
        $this->db = $db;
    

DBConfig 文件如下所示:

$db['default']['hostname'] = 'localhost'

【问题讨论】:

您的 DBConfig 文件就是这样吗?没有<?php? 看1:***.com/questions/9002188/…,2:***.com/questions/2679602/… 我实际上是通过制作 Config 类单例来解决它。似乎由于 Require_once 仅在第一次创建类时获取文件,因此该变量仅在我创建的第一个对象中可用。 @LasseVabeRolstad:这是require_once 的正常行为。它只需要一次。由此得名。另请参阅require 并请在下面添加您的“解决方案”作为答案并接受它(实际上我会说 Luc Franken 有答案)。只需在使用之前预先设置您需要的东西,然后您就不会遇到这些问题。是的,Singleton 是您的问题的一部分,而不是解决方案。 【参考方案1】:

我会做不同的事情并为此使用依赖注入,给你:

public function __construct((IDb)$Db) 
    $this->db=$Db;

这样以后测试你的软件更容易,很明显这个类需要一些数据库对象。这使您的代码也减少了耦合,这似乎是一个很好的架构决策。

此外,它还可以让开始使用不同的数据库类变得更加容易,从而节省您以后的时间和精力。

【讨论】:

【参考方案2】:

似乎由于 Require_once 仅在第一次创建类时获取文件,因此该变量仅在我创建的第一个对象中可用。

那么,将require_once 更改为requirerequire_once 用于包含定义类和函数的文件,a) 不需要包含多次,b) 如果包含多次,则会导致错误。如果您总是想包含该文件,请跳过_once

话虽如此,多次包含数据库配置是糟糕设计的标志。

【讨论】:

嗯,这样就可以解决问题了。但是,似乎 OP 正在使用require_once 来避免糟糕的架构问题,这不是该方法应该使用的方式。

以上是关于PHP - 类构造中的Require_once的主要内容,如果未能解决你的问题,请参考以下文章

PHP 构造方法 __construct()

PHP中的构造函数

PHP动态获取类构造函数并调用它来创建一个新实例[重复]

php中的构造函数与析构函数(魔术方法)

为啥没有构造函数参数的类需要括号

php面向对象编程之构造方法__construct()