【问题标题】:PHP - Two classes, talk to each other correctlyPHP - 两个类,正确地相互交谈
【发布时间】:2013-03-06 17:07:13
【问题描述】:

我有一个小问题。我已经尝试过搜索,但我无法完全正确地找到搜索字词,希望有人能提供帮助。

我的系统中的每个页面都有一个包含,其工作方式如下:

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

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

谢谢

【问题讨论】:

  • 为什么不将mysql类的实例传递给populatesession函数
  • 您应该使用依赖注入并将数据库实例传递给您的系统类。
  • 传递mysql类对象可以是你的解决方案

标签: php class global-variables


【解决方案1】:

你遇到的叫做组合。一个好的解决方案是使用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);

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

【讨论】:

  • 然后这样用? $this->b->Select('abc');
  • 或 $b = $this->b; $b->select() 在本地函数中。如果有多个调用,我通常会进行局部变量赋值以节省一些输入。
  • 感谢您的回复 - 很有道理。不过还有一件事——如果我希望 System 类中的东西能够访问 MySQL 类,而 MySQL 类中的东西能够访问 System 类怎么办?我不能同时注射,我确定?或者如果这是一个要求,我是否正在接近一个糟糕的系统?
  • 然后实例化两者而不是构造函数,并在相应的类中添加 setA($a) 和 setB($b) 方法。为什么通常不使用这种 DI 框架,因为很容易忘记调用这些框架,并且管理成为一场噩梦。
  • 非常感谢您的帮助,您能给我一个代码示例或一个解释的地方吗?我无法完全理解他们如何相互引用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 2011-06-02
相关资源
最近更新 更多