我是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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我估计现在这个班级的身体是微不足道的.
主要问题是我对理解OOP的想法有些问题.
我想在每次运行代码时添加发送电子邮件.我已经下载了PHPMailer Class并用它扩展了我的类:
class ftpConnect extends PHPMailer {...}
Run Code Online (Sandbox Code Playgroud)
我添加了一些变量和方法,一切都按预期工作.
我想:为什么不在数据库中添加存储内容.每次用户运行上面的代码时,应将适当的信息存储在数据库中.
我可以编辑我的ftpConnect class并添加连接到构造函数的数据库,以及其他一些更新表的方法.但是数据库连接和所有这些东西将来可以被其他类使用,所以它绝对应该在单独的类中实现.但是我的"主要" ftpConnect class已经扩展了一个类,并且不能再扩展一个类.
我不知道如何解决这个问题.也许我ftpConnect class是复杂的,我应该以某种方式将它分成几个较小的类?任何帮助深表感谢.
对于初学者,我认为你的班级有一个设计缺陷.你的构造函数正在做工作.这不是构造函数应该在适当的OOP中做的事情.您的构造函数应该只设置属性,您应该有一个单独的方法connect().
第二个ftpConnect永远不应该延伸PHPMailer.它们是两个完全不同的东西.阅读Liskov替代原理,它是SOLID原则的一部分.
如果您的类需要对数据库执行某些操作或需要发送邮件,则需要将这些实例注入到类中而不是扩展它们.这称为依赖注入,这将使以后更容易进行单元测试,因为您可以轻松使用模拟邮件程序类或模拟数据库类.
如果你想发送邮件,拥有数据库访问权限并使用FTP,你至少需要3个不同的(分离的)类(甚至可能需要为db等做一些映射).基本上每个班级都应该有一个责任而一个只有一个.这被称为单一责任原则.
对于一些一般参考,请参阅