Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在更复杂的OOP概述中正确构造类和方法_Php_Mysql - Fatal编程技术网

Php 如何在更复杂的OOP概述中正确构造类和方法

Php 如何在更复杂的OOP概述中正确构造类和方法,php,mysql,Php,Mysql,我试图理解高级PHP OOP原则,已经编写了多年的程序化PHP。我想知道,对于如何最好地将函数分组到类中,以及如何计划要抽象/扩展哪些类,是否有经验法则?如果没有,你能推荐一些有帮助的高级读物吗 我读过一些(自定义的)“高级”OOP教程。这些示例教会了我如何创建非常松散耦合的对象的基础知识,这些对象具有在高度抽象的类中定义的非常小的属性。我还读过其他(糟糕的)教程,这些教程基本上将函数转换为方法,并将它们封装到类中——我知道它们写得不好,所以不想模仿它们 但是,我不清楚如何决定构建项目所围绕的类

我试图理解高级PHP OOP原则,已经编写了多年的程序化PHP。我想知道,对于如何最好地将函数分组到类中,以及如何计划要抽象/扩展哪些类,是否有经验法则?如果没有,你能推荐一些有帮助的高级读物吗

我读过一些(自定义的)“高级”OOP教程。这些示例教会了我如何创建非常松散耦合的对象的基础知识,这些对象具有在高度抽象的类中定义的非常小的属性。我还读过其他(糟糕的)教程,这些教程基本上将函数转换为方法,并将它们封装到类中——我知道它们写得不好,所以不想模仿它们

但是,我不清楚如何决定构建项目所围绕的类-我不确定是否应该首先考虑应用程序的宏特性或频繁执行的操作

以一个网站为例,其中: -根据用户的不同,用户可以注册并拥有不同的权限 水平 -用户可以编辑他们的用户详细信息、上传照片、注册邮件列表以及与其他用户加入群组 -管理员可以在站点的5个不同模块区域内创建新的分区 -用户可以在这些不同的部分发布文章和评论

1) 如果管理员可以在5个不同的模块区域(单级、双级和三级博客、论坛、投票)内创建一个分区,那么我应该按照每个模块一个类来考虑吗

或者2)我应该为管理员创建的每个新分区生成一个新的“类”吗

或者3)用户是整个站点的中心焦点-用户与模块和部分交互-所以我要创建一个包含插入、编辑和删除方法的大型用户类吗

从那以后,最好把方法放在哪里

a) 我需要经常使用SQL insert子句-当有人注册时,我需要插入到用户表中,当有人创建或加入组时,或发布文章、评论或IM时,我需要插入到组表中-因此我将使用如下方法。。。但这应该嵌套在所有其他类中,还是在每个模块类中重复

    // runs a sql query
    public function runQuery($qry) {
        $result = $this->mysqli->query($qry);
        return $result;
    }
类似的事情,比如多次给用户发电子邮件——当他们注册激活帐户时,当他们加入邮件列表时,如果他们忘记了密码。。。所以我想我需要一种方法

正如您所看到的,我很困惑应该将方法放在哪个类中,以及围绕哪个类构建站点

我相当确信,在开始之前,我不需要考虑“所有”我的特性,因为在敏捷开发环境中,用户可能会建议新特性,所以我希望您能为我提供一点相对简单的指导

这只是我以前按程序编写的许多站点示例中的一个,现在我想开始用面向对象的术语来思考这些站点,所以任何指针都将非常感谢


谢谢

如果不了解您真正想要什么,就很难找到合适的解决方案。当您面临问题/功能请求时,您必须设计应用程序。一切都取决于特性/问题

有许多不同的解决方案,每一种都适用于特定情况。如果我不深刻理解你想解决什么问题,我就无法回答你的问题。我唯一的建议是: -吻-保持简单愚蠢 -坚实的原则,特别是单一责任规则——每个班级只应对一件事负责。例如,如果您有用户对象,则至少应该有三个类。UserEntity或UserDomain—该用户的对象、存储库/存储的简单表示,为您提供对给定用户的基本操作(CRUD—创建、读取、更新、删除),然后您应该有一个模块,即处理交互的服务(例如,不同用户之间的交互)。一个阶级知道的越少越好

开始的好方法是至少读一点关于设计模式的知识,比如说DDD(领域驱动设计)。此外,我可以建议观看CleanCoders。在我看来,鲍勃叔叔有非常好的软件开发视频教程

我曾经说过,如果你想做正确的事情,你必须做两次。在第一种方法中,你们不知道你们能期望什么,若不深刻理解你们所面临的问题,你们就无法得到最好的解决方案。
当我写一段代码时,例如一个类,我总是至少写两次。在开发过程中,类的几乎每个部分都进行了重构,以删除重复的代码,提高性能。开发人员第一次提供完美的解决方案是非常罕见的。

很明显,您的想法非常深刻,并且有良好的意图。一个人在尝试提出完美的OOP设计时可能会非常激动。这需要多年的经验、实践和良好的判断力。我的最佳建议是建立原型,找出最适合您个人问题的解决方案,它可能会给你一个更好的想法。我认为你应该根据你的需要对你的函数进行分类,把普通函数放在一个基类中,然后从基类中进行扩展。你可能对完美的OOP设计模式考虑得太多了。我建议写一个框架,直到你对它印象深刻。这是一个很好的问题。太宽泛了。