PHP - 两个类,正确地相互交谈

时间:2013-03-06 17:07:13

标签: php class global-variables

我有一个小问题。我已经尝试过搜索,但我无法完全找到搜索条件,希望有人可以提供帮助。

我的系统中的每个页面都包含一个包含这样的内容:

<?PHP
require_once("class.system.php");
require_once("class.mysql.php");

$oMySQL = new MySQL();
$oSystem        = new SystemClass();

... ?>

但我有一个问题。正如您可能猜到的那样--MySQL类是一组用于简化MySQL调用的函数。这不是我想要使用它的唯一例子,但它是一个很好的例子。

我在系统类中有函数我希望能够引用MySQL类(反之亦然......)。

作为一个例子,我在系统类中有一个函数,它将使用来自MySQL的数据填充会话变量。我能想到的唯一方法(我知道这是错误的......)是:

class SystemClass {

    function PopulateSession(){
         global $oMySQL;
         if($oMySQL->Select('abc')){
             $_SESSION['def']= blahblahblah;
             return true;
         } else {
             return false;
         }
    }
}

它有效,但它意味着我想要使用它的每个功能,我必须使用全局,我确信这是非常糟糕的做法。有人可以建议吗?

由于

1 个答案:

答案 0 :(得分:3)

您遇到的是组合物。一个好的解决方案是使用dependency injection框架。一个简单的解决方案是使用构造函数参数滚动。

public class A { 
  private $b;
  public function __construct($b) {
    $this->b = $b;
  }
}

$b = new B;
$a = new A($b); 

或者,作为一种更灵活的解决方案,当您有相互依赖关系时:

public class A {
  private $b;
  public function setB($b) {
    $this->b = $b;
  }
}

public class B {
  private $a;
  public function setA($a) {
    $this->a = $a;
  }
}

$a = new A;
$b = new B;
$a->setB($b);
$b->setA($a);

但缺点是,随着依赖项数量的增加,很难管理并记住设置所有依赖项。这正是依赖注入框架受欢迎的原因。