2012-02-02 71 views
2

当我使用require_once并尝试访问所需文件中的变量时,出现错误,表明变量($db)未定义。PHP - 类构造内的Require_once

我试图把require_once声明放在几个不同的地方,因为我认为它可能是变量的范围问题,但在这一点上,我尝试在构造函数中调用它,并将值赋给一个类变量。

我的配置类:

class Config { 

    public $db; 

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

的对DBConfig文件看起来是这样的:

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

DBConfig文件就是这样吗?没有'<?php'? – deceze 2012-02-02 12:58:41

+0

看看1:http://stackoverflow.com/questions/9002188/require-once-to-global-scope-within-a-function,2:http://stackoverflow.com/questions/2679602/what-is需求一旦在-php – 2012-02-02 13:00:39

+0

是BASE_DIR定义? – ianbarker 2012-02-02 13:02:01

回答

8

我会采取不同的方式,并使用依赖注入这个,给你:

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

这样,稍后测试软件会更容易,很显然,这个类需要一些数据库ob JECT。这使得你的代码更少耦合,这似乎是一个很好的架构决策。

此外,它会使开始使用例如不同的数据库类,它可以节省您以后的时间和精力更容易。

2

看来,由于Require_once只在第一次创建类时才获取文件,所以该变量仅在创建的第一个对象中可用。

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

话虽如此,包括数据库配置不止一次是一个坏设计的标志。

+0

嗯,这会解决问题。但是,似乎OP正在使用'require_once'来避免糟糕的体系结构问题,这不是该方法应该使用的方式。 – sitilge 2016-06-24 21:04:42