正如标题所说,在包含文件的类中访问变量(关联数组)时出现问题。以下是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
答案 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是类命名的典型惯例,例如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;
// ...
}
构造函数:
{{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']
。