无法从包含的文件中访问变量

时间:2012-03-15 11:36:40

标签: php oop

正如标题所说,在包含文件的类中访问变量(关联数组)时出现问题。以下是class和include文件的源代码:

require("applications/cw_database.php");
require("config/dbConfig.php");
require("config/appConfig.php");

class APP_ASSESMENTS
{
    private $dbObj;
    private $DisplayOutput  = "";

    public function __construct($PageParams)
    {
        try
        {
            $dbObj = new CW_DB($dbConfig['hostname'],$dbConfig['username'],$dbConfig['password'],$dbConfig['name'],$dbConfig['port']);
        } catch (Exception $e) {
            throw new ErrorException($e);
        }
    }
...

另一部分与$ dbConfig无关。 这也是包含的文件(config / dbConfig.php):

    /*
    Testing configuration for MySQL database
*/
$dbConfig['username']   = "phpcoursework";  // changed on demand
$dbConfig['password']   = "phpcoursework";  // changed on demand
$dbConfig['hostname']   = "localhost";      // changed on demand
$dbConfig['name']       = "students";       // changed on demand
$dbConfig['port']       = 3306;             // default for MySQL

3 个答案:

答案 0 :(得分:0)

包含用于访问范围。因此,要访问变量,您需要在类中包含文件。如前所述,global也允许您从另一个范围访问变量。但全球应谨慎使用!请参阅文档。

See the manual for more information.

编辑:我需要说明全局变量从来不是处理这些关键变量的好选择。

答案 1 :(得分:0)

首先,$dbObj不会自动承担类成员范围,它会创建CW_DB的本地副本,并在__construct返回时将其丢弃。您需要明确引用该属性;

$this->dbObj = ...

无论如何,按照其他人的建议使用global的全局状态将“工作”,但如果您正在使用OOP实践,则最好不要这样做。您实际上可以从include()返回,因此可以选择执行以下操作:

// your config file dbConfig.php
return array(
    'username' => "phpcoursework",
    'password' => "phpcoursework",
    'hostname' => "localhost",
    'name' => "students",
    'port' => 3306,
);

通过构造函数或方法(这里的构造函数)将其注入对象

class APP_ASSESMENTS
{

    private $dbObj;

    public function __construct($dbConfig, $PageParams)
    {
        $dbObj = new CW_DB($dbConfig['hostname'], $dbConfig['username'],
            $dbConfig['password'], $dbConfig['name'], $dbConfig['port']);
        // ...
    }

}

// include() here, will actually return the array from the config file
$appAssesments = new \APP_ASSESMENTS(include('dbConfig.php'), $PageParams);

建议你进入另一个级别:相反,注入数据库对象本身,将依赖性从APP_ASSESSMENTS类中取出。

此外,PascalCase是类命名的典型惯例,例如AppAssessmentsCwDb


$dbObj = new CwDb(include('dbConfig.php'));
$appAssessments = new AppAssessments($dbObj, $etc, $etc);

这个简单的更改允许您从AppAssessments CwDb上删除CwDb的相关性。这样,如果由于某种原因扩展AppAssessments,您只需传入扩展类的实例,而无需更改AppAssessments中的任何代码

您可以像这样更改public function __construct(CwDb $db, $etc, $etc){ $this->db = $db; // ... } 构造函数:

{{1}}

这利用了PHP(有限的,虽然仍然有用)类型提示,确保第一个参数始终是正确的类型。

这是开放/封闭原则的一部分:类应该对扩展开放,但是关闭以进行修改。

答案 2 :(得分:-1)

public function __construct($PageParams){
    global $dbConfig;
    try{
        $dbObj = new CW_DB($dbConfig['hostname'],$dbConfig['username'],$dbConfig['password'],$dbConfig['name'],$dbC    onfig['port']);
    } catch (Exception $e) {
        throw new ErrorException($e);
    }
}

或者您可以使用$GLOBALS['dbConfig']