正如标题所说,从包含的文件访问类内的变量(关联数组)时出现问题。这是类和包含文件的源代码:
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是类命名的典型约定,如AppAssessments
和CwDb
)
$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;
// ...
}
这利用了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']
。