我已经尝试了一段时间了解OOP(虽然没有太多的业余时间做多少)。虽然汽车和书籍的类比帮助我理解了这个概念,但我一直未能找到一个真实世界的场景(与带有数据库访问的PHP程序有关)。
这是我最近使用OOP的尝试。这是一个向数据库提交用户消息的简单程序。
require_once('init.php');
require_once('Classes.php');
$message = new ContactMessage($db);
if(!$message->validateForm()){
$message -> returnSessionError('Failed to validate your form. Please try again');
header('Location: ../index.php?p=contact');
}else if($message->checkSubmissions(3,10) == false){ //form info okay, check if ip has submitted more than the allowed times. Sets max for 5mins and 24hrs respectively.
if($message->max5mins == true){ //maximum allowed messages in 5min period
$message ->returnSessionError('Too many messages have been sent from the same IP address.
Please wait at least 5 minutes and try again.');
header('Location: ../index.php?p=contact');
}elseif($message->max24hrs == true) { //max allowed in a day
$message ->returnSessionError('To prevent spam, your IP address has been blocked for 24 hours. Please try again later.');
header('Location: ../index.php?p=contact');
}
}else{ //everything is fine, add to database.
if($message -> insertToDB()){
$message -> returnSuccess('Thank you for your message, I\'ll get back to you ASAP.');
header('Location: ../index.php?p=contact');
}else{
$message -> returnSessionError('Something has gone wrong in our server - Please try again later.');
header('Location: ../index.php?p=contact');
}
}
对我来说,我仍然看到我的代码使用了一堆函数,除了它现在包裹着Class
。这是正确使用OOP,还是我只是假装使用它?
由于
答案 0 :(得分:3)
就OOP而言,你做错了,因为你在混合概念和责任。 你在这里做的是处理数据验证,包括输入和记录
表单验证器基本上由两部分组成:
它基本上检查值是否为空,它们的最大长度还是最小长度。
它基本上查询存储以查找记录存在并生成相应的错误消息。
它是输入和记录验证器之间的桥梁。它基本上检查字段是否有效,然后开始检查记录。如果输入和记录都有效,则其isValid()
方法返回true,否则返回false
并填充包含错误消息的数组。
$dataMapper = new ContactMapper($pdo);
$inputValidator = new InputValidator();
$recordValidator = new RecordValidator($dataMapper);
$formValidator = new FormValidator($inputValidator, $recordValidator);
if ($formValidator->isValid($data)) {
if ($dataMapper->insert($data)){
// Success, do something like a redirect
} else {
// Failed to insert
}
} else {
print_r($formValidator->getErrors());
}
就OOP而言,您同时遵守Single-Responsibility Principle和Separation of Concerns,因为您将分离的责任封装在为其提供服务的类中。因此,您将能够修改应用程序的一部分而无需更改另一部分。
这应该基本上封装在抽象表的访问权限的Mapper中。
答案 1 :(得分:0)
我认为你的这个文件是,只负责执行这个脚本。没有其他脚本,也没有HTML代码。我们称之为“post.php”。
在OOP范例中,始终创建面向代码,而不仅仅是在您可以重用代码时。
在我看来,为了让你有一个好的OOP实现,所有脚本必须在类中,除了调用方法的那些,以及你需要的任何其他东西,并且不能放入类中(对不起,这很困难)在后者中更具体)。你有两种可能性:
main
方法),创建dinamic页面; 因此,您的脚本应该在某个类中,可以是ContactMessage
,在“post.php”中,您只需调用ContactMessage
的方法,例如postMessage
这就是所有这些。
更清楚的是,我会在postMessage
课程中创建一个ContactMessage
方法,并从其他课程中调用validateForm
,checkSubmissions
,insertToDB
... (而不是自己的ContactMessage
),像其他人所说的那样创造“单一责任”。一个负责验证的类,一个负责抽象数据库等等......
在我短暂的经历中,一个真实的场景比这更复杂,但你会根据需要调整。
最后一件事:我会将所有重定向放在类外,在“post.php”中,并且只是两个可能的重定向,一个如果失败,一个如果成功。