你能得到一个调用类的变量吗?

时间:2008-12-03 01:42:16

标签: php oop

我有一个类Page,它创建了DB的实例,名为$db

__construct()的{​​{1}}中,我创建了新的Page对象,并从文件中提取了一堆配置数据。

现在,DB类有一个方法$db,它(尝试)连接到数据库。

DB类中有没有办法调用父类的配置数组?如果我不需要,我不想创建全局变量,我不想两次获取配置数据。

伪代码可能看起来像这样......

_connectToDB()

6 个答案:

答案 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对象初始化。