我有一个类Page
,它创建了DB
的实例,名为$db
。
在__construct()
的{{1}}中,我创建了新的Page
对象,并从文件中提取了一堆配置数据。
现在,DB类有一个方法$db
,它(尝试)连接到数据库。
DB类中有没有办法调用父类的配置数组?如果我不需要,我不想创建全局变量,我不想两次获取配置数据。
伪代码可能看起来像这样......
_connectToDB()
答案 0 :(得分:6)
我发现通常更容易初始化所有“重要”对象,接近他们需要知道的任何变量。你可以这样试试:
/* Code to get config variables here */
$DB = new DB($config);
/* You might want to delete the database password from $config here */
$Page = new Page($config, $DB);
这样做意味着您还可以对数据库对象进行类型检查:
class Page {
function __construct(array $config, DBClass $db) { }
}
答案 1 :(得分:1)
为什么不将配置参数传递给connectToDb函数或将配置数据传递给DB类的构造函数。
目录回答问题:你对当前环境中的外部调用上下文一无所知。
答案 2 :(得分:1)
请参阅debug_backtrace()
以获取有关调用类或对象的信息。
然后查看Reflection以获取有关给定类或对象的属性的更多信息。
编辑但是为了它的价值,我还建议您传递所需的特定参数。引用来电者的数据可能构成Content Coupling。
答案 3 :(得分:1)
如果您想要共享变量而不传递这些变量,则可以使用static
:
class page{
static $configArray = [];
function doWhatever(){
$db = new DB();
$db->connectToDB();
}
}
class DB{
function connectToDB(){
$dbUsername = page::$configArray['dbUserName'];
}
}
在这种情况下将这些数据设置为static
是有意义的,因为即使您有多个页面类实例,配置参数也应始终相同。
无论如何,我认为构建和保留$ configArray只能在DB类中更好。如果要从外部调用它,可以使用相同的static
逻辑。
答案 4 :(得分:0)
您可以向子项传递对父项的引用。例如:
class Parent {
function __construct() {
$this->myChild = new Child($this);
}
public function doSomething() {}
}
class Child {
function __construct(Parent $parent) {
$parent->doSomething()
}
}
你可能会发现这很奇怪,因为你仍然在父的构造函数中,因此你的父对象还没有完全构造。但你仍然可以使用$ this作为对自己的引用,即使在构造函数中也是如此。您只需要小心,您的孩子不会引用父母中尚未初始化的内容。
答案 5 :(得分:0)
一般来说,没有简单的方法可以做到这一点。但作为一般设计问题,我可以看到为什么你要避免全局变量,但在应用程序范围配置的情况下,全局访问属性是完全合理的。
您可以将配置数据设置为全局,也可以将所需的属性传递给db对象初始化。