我应该使用OOP来减少混乱,还是只有当我能看到自己重用代码时?

时间:2014-01-13 10:56:36

标签: php oop

我已经尝试了一段时间了解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,还是我只是假装使用它?

由于

2 个答案:

答案 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 PrincipleSeparation of Concerns,因为您将分离的责任封装在为其提供服务的类中。因此,您将能够修改应用程序的一部分而无需更改另一部分。

处理存储逻辑 - 也是另一个责任

这应该基本上封装在抽象表的访问权限的Mapper中。

答案 1 :(得分:0)

假设

我认为你的这个文件是,只负责执行这个脚本。没有其他脚本,也没有HTML代码。我们称之为“post.php”。

回答标题问题

在OOP范例中,始终创建面向代码,而不仅仅是在您可以重用代码时。

回答身体问题

在我看来,为了让你有一个好的OOP实现,所有脚本必须在类中,除了调用方法的那些,以及你需要的任何其他东西,并且不能放入类中(对不起,这很困难)在后者中更具体)。你有两种可能性:

  1. GET页面:从服务器获取信息并与视图混合(即HTML;其他语言中的main方法),创建dinamic页面;
  2. POST页面:来自您的表单的目标;在没有任何HTML的分隔页面中,将信息发布到服务器,就像你的“post.php”。
  3. 因此,您的脚本应该在某个类中,可以是ContactMessage,在“post.php”中,您只需调用ContactMessage的方法,例如postMessage这就是所有这些。

    更清楚的是,我会在postMessage课程中创建一个ContactMessage方法,并从其他课程中调用validateFormcheckSubmissionsinsertToDB ... (而不是自己的ContactMessage),像其他人所说的那样创造“单一责任”。一个负责验证的类,一个负责抽象数据库等等......

    最后的考虑因素

    在我短暂的经历中,一个真实的场景比这更复杂,但你会根据需要调整。

    最后一件事:我会将所有重定向放在类外,在“post.php”中,并且只是两个可能的重定向,一个如果失败,一个如果成功。