php - 如何使用OOP

时间:2017-02-17 22:22:49

标签: php oop procedural-programming

这可能会多次讨论,但我想知道OOP如何帮助我改进代码。 我曾经以程序方式编码。但是有一个合理的逻辑。整个项目中使用的代码片段都包含在函数中。但是所有函数都放在一个大的functions.php文件中(我觉得效率不高)。 例如,这是检查销售是否已过期的功能:

function is_sales_expired($salesId, PDO $conn) {
    $now=time();
    $sql="SELECT * FROM specialoffers WHERE id=:id";
    $st=$conn->prepare($sql);
    $st->bindvalue(":id",$salesId,PDO::PARAM_STR);
    $st->execute();
    $sales_array=$st->fetchAll();
    if($now<$sales_array[0]['finishdate'] && $now>$sales_array[0]['startdate']) {
        return FALSE;
    } else {
        return TRUE;
    }
}

现在我决定转到OOP并将我的代码转换为OOP。所以我创建了类并将与特定行为相关的函数放入每个类中。例如,具有is_sales_expired()的销售类以及与销售相关的其他方法。属性和构造函数如下所示:

class Sales
{
    private $conn;
    private $stockObj;
    private $userObj;
    private $cartObj;
    private $randomObj;

    function __construct(PDO $conn)
    {
        $this->conn = $conn;
        $this->stockObj = new Stock($this->conn);
        $this->userObj = new User($this->conn);
        $this->cartObj = new Cart($this->conn);
        $this->randomObj = new Random($this->conn);
    }
    //methods come here//
}

然后我使用spl_autoload_register在我的代码中加载类,所以我不必在所有其他文件中包含所有类文件。使用这种方法,调用方法更容易,我不需要将PDO $conn传递给每个方法调用,并且它已经与构造函数一起传递。

嗯,这些都很好,所有相关代码现在都在一个地方,可能更容易管理。但我有一种感觉,OOP应该提供更多。使用我使用的方法,我不觉得,现在我的代码更有效和可维护。我觉得我应该错过这里的一些概念。 感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您开始将代码组织到对象中是件好事,这是更好地应用于更好的应用程序结构。 一旦你开始深入研究它,你就会找到将当前对象分成更小部分的方法,并以更好的方式组织它们,减少代码以更灵活的方式解决更多问题。

例如,在您的代码中,业务逻辑仍然与数据库紧密耦合。如果您决定使用mysqli而不是PDO,该怎么办?您必须触摸申请表中的每个班级。

但是,如果将数据库交互提取到业务逻辑使用的自有对象集中,则更换数据库访问层会更容易。实际上,在这种情况下,你可以很容易地用PostgreSQL替换MySQL,甚至用普通文件替换它。

我可以想出两种方法来了解有关OOP如何工作的更多信息:阅读book或从现有代码中学习。

我链接的这本书是我最喜欢的OOP书,它展示了一些很好的例子,说明如何通过将程序分解为合作对象来解决问题。

我还建议开始使用一些OOP框架,过去我对Yii有一些很好的经验,请查看guide以查看它的外观。您将看到大量有用的对象解决了在开发Web应用程序时必须始终解决的各种问题。 尝试用它构建一些简单的应用程序,然后尝试查看框架代码,看看它是如何工作的。

另一个建议是研究自动测试。这不仅可以使您的应用程序保持活力,还可以教您如何构建更好的对象。您必须在两种不同的情况下使用您的课程 - 您的实际代码和测试。在内部测试中,您需要将正在测试的对象与其余代码隔离开来,例如,在不触及数据库的情况下测试销售统计算法。而且你必须将代码分成更小,更灵活的结构才能做到这一点。

答案 1 :(得分:1)

你有一个良好的开端,需要时间来开始考虑对象的架构。 OOP的优势在于它可以模仿代码必须交互的内容。因此,请考虑需要处理的事情以及需要执行的操作。所以在你的例子中,你可以有一个新的类SpecialOffers,它将处理与你的specialoffers表相关的所有事情。

例如:

class SpecialOffers {

function __construct(PDO $conn)
{
    // this is connected to the server table
    $this->conn = $conn;

}

// get the details of a special offer
private function get($salesId) {

    $sql="SELECT * FROM specialoffers WHERE id=:id LIMIT 1";
    $st=$this->conn->prepare($sql);
    $st->bindvalue(":id",$salesId,PDO::PARAM_STR);
    $st->execute();
    $rows = $st->fetchAll();

    if (count($rows) > 0) {
        return $rows[0];
    } else {
        return null;
    }

}

// answers whether a particular sales is active
public function isActive($salesId) {
    $answer = $this->get($salesId);

    if (isset($answer['finishdate']) && isset($answer['startdate'])) {
        $now=time();
        return $now<$answer['finishdate'] && $now>$answer['startdate'];          
    } else {
        return false;
    }

}

}

还有很多事情要做,比如错误处理,但你可以看到它在事情发生时变得越来越明显,而你只想到特别优惠。他们是如何工作的?什么可能出错?

最后,在尝试考虑类的范围时,最好的建议是来自SOLID原则。第一个,S - 单一责任原则:

  

一个班级应该只有一个责任(即只有一个   软件规范的潜在变化应该能够   影响类的规范)

最好的课程可以用一句话来描述。方法也一样,用一句话来描述它的作用。