【问题标题】:PHP - access parent class members from nested classesPHP - 从嵌套类访问父类成员
【发布时间】:2013-11-14 13:04:07
【问题描述】:

假设我将代码组织在类中,并且每个类都有自己的文件:

  • main.php,具有类 Main
  • config.php 具有类 Config
  • security.php 具有类 Security
  • database.php 具有类 Database

现在,Main 的构造函数将初始化 3 个对象,每个对象一个用于其他类,这样一来,一切都会或多或少像一个类/子类。问题是现在 Security 可能需要来自 Config 的东西(变量或函数)和 Database 来自 Security 的东西。

// main.php
// here I include the other files
class Main {
    functions __constructor() {
        $this->Config = new Config();
        $this->Security = new Security();
        $this->Database = new Database();
    }
}

// config.php
class Config {
    public $MyPassword = '123456';
    public $LogFile    = 'logs.txt';
    // other variables and functions
}

// security.php
class Security {
    functions __constructor() {
        // NOW, HERE I NEED Config->Password
    }

    function log_error($error) {
        // HERE I NEED Config->LogFile
    }
}

// database.php
class Database {
    functions __constructor() {
        // Trying to connect to the database
        if (failed) {
            // HERE I NEED TO CALL Security->log_error('Connection failed');
        }
    }
}

那么,我如何在 Main 内的这些嵌套类之间共享这些函数和变量?当然,我可以将这些变量作为参数发送给构造函数,但是当我们需要 5 或 10 个变量时会发生什么?我可以将整个对象 Config 发送到 Security 并将 Security 发送到 Database

// main.php
// here I include the other files
class Main {
    functions __constructor() {
        $this->Config = new Config();
        $this->Security = new Security($this->Config);
        $this->Database = new Database($this->Security);
    }
}

但这可靠吗?我可以只发送引用(如 C++ 中的指针)吗?也许我可以将洞 Main 对象的引用作为构造函数中的参数发送,这样就可以使所有内容都可用。

// main.php
// here I include the other files
class Main {
    functions __constructor() {
        $this->Config = new Config();
        $this->Security = new Security(&$this);
        $this->Database = new Database(&$this);
    }
}

我什至不知道这是否可能。 你怎么看?还有更传统的方法吗?

【问题讨论】:

  • Config 可以是一个静态类。或者,您的类可以继承基类 Config。
  • 数据库需要安全和安全需要配置。如果Security继承了Config,Database继承了Security,那么Database也继承了Config吗?如果安全需要数据库怎么办?
  • 是的,它也继承了配置:)
  • 1) 我想您很快就会意识到,但是您的示例中有一些语法错误:functions __constructor() 应该是 function __construct()。 2)这就是所谓的“依赖注入”;您的所有建议似乎在很大程度上都是合理的。 3) 您无需担心传递指针或对象引用,因为这就是对象的自然行为方式(具体而言,$foo =& $bar 使 $foo$bar 成为同一个变量;但变量只“指向” at" 无论如何都是一个对象,所以$foo = $bar 使两个变量指向同一个对象)。

标签: php class nested share members


【解决方案1】:

正如 cmets 中所述,您开始考虑与依赖注入相关的术语。您正在防御性地编码(正确地)以解决 SoC(关注点分离)的问题。你可能会像我一样尝试我称之为注册表模式的东西(我对这个主题一无所知,所以我在 windows 注册表之后命名它)。注册表包含所有可能需要传递的对象。这在实践层面上带来了一些好处

  • 如果我不确定其他东西是否需要 var,我只需将其添加到注册表中,只要我将注册表传递给他,依赖的人就会知道在哪里查找它
  • 如果我的项目非常小,并且我不想为这个想法而烦恼太多,那么这是一个简单的解决方案

这种思维模式背后有很多问题。假设项目开始变大,我知道它有时会发生在我身上。现在,像调试这样的简单任务变成了爬山,因为我试图找出为什么依赖项不在我正在寻找的地方,我必须追踪它的设置位置和时间点,以及是否有其他代码改变了它和为什么。

这意味着我们没有遵循 SoC 的原则,而是将关注点传递给现在承担所有责任的第三个对象。这个“注册表”对象现在负责的事情太多了,发生在它身上的任何更改都会波及你的所有代码。

根据我在 SO 和其他教程中阅读的内容,如果您的对象处理过多的依赖项(比如说具有 10 个参数的构造函数),那么我们可能做错了。

我希望其他人可以加入,因为我对这个主题非常感兴趣,但我无法将其付诸实践(主要是由于无知)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 2014-08-22
    • 1970-01-01
    • 2019-04-10
    • 1970-01-01
    相关资源
    最近更新 更多