2013-11-03 60 views
2

让我们假设我安排在班我的代码和每个类都有自己的文件:PHP - 从嵌套类访问父类成员

  • main.php,上课主要
  • 的config.php具有类配置
  • security.php具有类SECURI TY
  • database.php中上课数据库

现在,主要的构造函数将初始化3个对象,每个对应一个其他类的,而这一切的方式看起来会比较或不像一个类/子类。问题是,现在安全可能需要一些东西(变量或功能)从配置数据库东西来自安全。

// 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'); 
     } 
    } 
} 

那么,如何共享里面主要这些嵌套类之间的函数和变量?当然,我可以将这些变量作为参数发送给构造函数,但是当我们需要5或10个变量时会发生什么?我可以在整个对象发送配置安全安全数据库

// 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.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); 
    } 
} 

我甚至不知道这是否可能。 你觉得呢?有没有更多的传统方式?

+0

配置可能是一个静态类。或者,你的类可以继承基类Config。 –

+0

数据库需要安全和安全需要配置。如果安全性继承Config和数据库继承安全性,数据库是否继承Config?如果安全需要数据库呢? – ali

+0

是的,它确实继承了配置:) –

回答

0

正如评论中所述,您开始思考与依赖注入相关的术语。你在防御性编码(以及正确的)来解决SoC(分离问题)的问题。你可以尝试像我所做的那样,我称之为注册模式(我对这个主题无知,因此我在Windows注册表之后命名它)。注册表包含可能需要传递的所有对象。这给一些好处实用水平

  • 如果我不知道别的东西将需要一个变种,我只是把它钉住到注册表和依赖就会知道到哪里寻找它的人,如只要我通过他注册表
  • 如果我的项目是非常小的,我不希望身边麻烦事太多关于这个想法,那么这是一个简单的解决方案

有相当多的一组问题的背后这种思维模式。说项目开始变得更大,我知道它有时候会发生在我身上。现在,像调试这样的简单任务变成了登山,因为我试图找出为什么依赖不在我正在寻找它的地方,而且我必须跟踪它的设置位置和位置,以及其他一些代码是否改变了它,为什么。

所有这些意思是说,我们不是遵循SoC原则,而是将关注点传递给了现在承担全部责任的第三个对象。这个“注册表”对象现在负责太多事情,任何发生在它上面的变化都会影响你的所有代码。

从我读过的SO和其他教程中,如果你有一个对象是杂耍过多的依赖关系(假设有10个参数的构造函数),那么我们可能不会做正确的事情。

我希望别人能附和这个,因为我对这个问题很感兴趣,但我一直无法把它在实践中(主要是由于无知)