PHP -两个类,正确地相互通信


PHP - Two classes, talk to each other correctly

我有一个小问题。我试着搜索了一下,但是我找不到正确的搜索词,希望有人能帮助我。

我在系统的每个页面上都有一个include,它的工作原理是这样的:

<?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;
         }
    }
}

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

谢谢

你遇到的是所谓的合成。一个好的解决方案是使用依赖注入框架。一个简单的解决方案是使用构造函数参数。

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);

但缺点是,随着依赖项数量的增长,很难管理和记住设置所有的依赖项。这正是依赖注入框架流行的原因。