【问题标题】:PHP - Require_once inside a class constructPHP - 类构造中的Require_once
【发布时间】: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?
  • 我实际上是通过制作 Config 类单例来解决它。似乎由于 Require_once 仅在第一次创建类时获取文件,因此该变量仅在我创建的第一个对象中可用。
  • @LasseVabeRolstad:这是require_once 的正常行为。它只需要一次。由此得名。另请参阅require 并请在下面添加您的“解决方案”作为答案并接受它(实际上我会说 Luc Franken 有答案)。只需在使用之前预先设置您需要的东西,然后您就不会遇到这些问题。是的,Singleton 是您的问题的一部分,而不是解决方案。

标签: php


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 嗯,这样就可以解决问题了。但是,似乎 OP 正在使用require_once 来避免糟糕的架构问题,这不是该方法应该使用的方式。
    猜你喜欢
    • 2017-03-12
    • 2011-02-08
    • 1970-01-01
    • 2012-09-30
    • 2011-08-25
    • 2012-06-27
    • 2013-03-27
    • 1970-01-01
    • 2014-12-16
    相关资源
    最近更新 更多