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


Unable to access variable from included file

正如标题所说,从包含的文件访问类内的变量(关联数组)时出现问题。这是类和包含文件的源代码:

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

首先,$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);

这个简单的更改允许您删除AppAssessmentsCwDb的依赖关系。这样,如果出于某种原因扩展了CwDb,则只需传入扩展类的实例,而无需更改AppAssessments中的任何代码

您可以这样更改AppAssessments构造函数:

public function __construct(CwDb $db, $etc, $etc){
    $this->db = $db;
    // ...
}

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

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

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

有关详细信息,请参阅手册。

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

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']