5

我是 OOP 的初学者,现在我正在尝试编写一些 PHP 类来连接 FTP 服务器。

class ftpConnect {
  private $server;
  private $user;
  private $password;

  private $connection_id;
  private $connection_correct = false;

  public function __construct($server, $user = "anonymous", $password = "anonymous@mail.com") {

    $this->server   = $server;
    $this->user     = $user;
    $this->password = $password;

    $this->connection_id      = ftp_connect($this->server);
    $this->connection_correct = ftp_login($this->connection_id, $this->user, $this->password);

    if ( (!$this->connection_id) || (!$this->connection_correct) ){
        echo "Error! Couldn't connect to $this->server";
        var_dump($this->connection_id);
        var_dump($this->connection_correct);
        return false;
    } else {
        echo "Successfully connected to $this->server, user: $this->user";
        $this->connection_correct = true;
        return true;
    }
  }
}

我认为目前班级的主体是微不足道的。

主要问题是我在理解 OOP 理念方面存在一些问题。

我想在每次运行代码时添加发送电子邮件。我已经下载了PHPMailer 类并用它扩展了我的类:

class ftpConnect extends PHPMailer {...}

我添加了一些变量和方法,并且一切都按预期工作。

我想:为什么不添加将所有内容存储在数据库中。每次用户运行上述代码时,都应将适当的信息存储在数据库中。

我可以编辑我的ftpConnect class并添加连接到构造函数的数据库,以及一些其他更新表的方法。但是数据库连接和所有这些东西将来可以被其他类使用,所以它肯定应该在单独的类中实现。但是我的“主要”ftpConnect class已经扩展了一个类,并且不能再扩展一个类。

我不知道如何解决这个问题。也许我ftpConnect class的太复杂了,我应该以某种方式将它分成几个较小的类?任何帮助深表感谢。

4

2 回答 2

8

对于初学者,我认为您的班级存在设计缺陷。您的构造函数正在工作。这不是构造函数在正确的 OOP 中应该做的事情。你的构造函数应该只设置属性并且你应该有一个单独的方法connect()

第二ftpConnect永远不应该延长PHPMailer。它们是两种完全不同的东西。阅读Liskov 替换原则,它是SOLID 原则的一部分。

如果你的班级需要对数据库做一些事情或需要发送邮件,你需要将这些实例注入你的班级而不是扩展它们。这称为依赖注入,这将使以后进行单元测试变得容易,因为您可以轻松地使用模拟邮件程序类或模拟数据库类。

如果你想发送邮件,拥有数据库访问权限并使用 FTP,你至少需要 3 个不同的(分离的)类(可能需要更多的类来为数据库等做一些映射)。基本上每个班级都应该有一个责任,而且只有一个。这称为单一责任原则

有关一些一般参考,请参阅:

于 2012-10-13T21:50:37.927 回答
0

这可能是组合优于继承的问题 请参阅此 Prefer composition over inheritance? 只需在你的类中使用 mailer 对象,DB 也是如此,而不是你的类扩展它们中的任何一个。

class my_class
{
    private $mailer;

    public function __constructor()
    {
         $this->mailer = new Mailer();
    }
}
于 2012-10-13T21:44:39.000 回答