PHP项目结构

时间:2017-05-22 08:27:47

标签: php oop

我有一个我使用结构编程创建的项目,我希望将其作为面向对象的项目重构在最好的" bestpractices"办法。我可能是唯一一个使用这个项目的人,它实际上并不适合其他人。但我可能会把它作为卓越的例子展示给别人;)

我的问题非常普遍,但我希望这没关系。

我正考虑将它分成三种方式;后端(主类),前端(获取和发布检查,调用类功能),可视化(使用Twig模板)。 我的项目将使用IPS论坛软件的外部集成(用户会话将保留在那里)。 请参阅下面的代码,了解如何构建此代码。

我的问题:

  1. 我的总体结构是否正确,该课程与"前端"分开?像这样?
  2. 我的想法是在类之外让IPS成员查找/处理好了,因为我以后可以切换到前端的其他一些成员功能而不会弄乱后端吗?只需将成员对象从任何地方放入类中,确保始终至少设置类使用。
  3. 我应该将成员数据作为参数发送到类(构造),还是像现在一样保留它并从前端设置公共类var?
  4. 我的班级应该在错误上抛出异常还是返回true / false并设置错误消息?
  5. 前端是否也应该是一个班级?扩展主类?
  6. 在__construct中设置错误消息就好了,或者应该在其他地方完成?
  7. MyProject类应该分成多个类吗?结构代码中的当前项目是10000行,新类可能是大约一半,因为我已经取出了大量的视觉渲染内容。也许是MyProjectDisplayData和MyProjectCreateData的类等等?
  8. 如果回答7是肯定的,我应该为消息,数据库和一般功能设置一个核心类,其他特定类"扩展"?
  9. 还有其他人可能会想做些什么吗?
  10. myproject_class.php:

    ? extends PartDecorator<V, ? extends Part<V>>

    前端index.php:

    namespace MySpace;
    
    use \PDO;
    use \PDOException;
    use \Exception;
    
    class MyProject {
    
        public $projectdata;
        public $errormessages;
        public $ips_member;
    
        function __construct () {
            //set up vars for error messages
            $this->errormessages["database_queryfailed"] = "Query failed";
            $this->errormessages["general_missingdata"] = "Missing data";
            $this->errormessages["handling_something"] = "Some error";
        }
    
        public function displaySomeData ( $id ) {
            if ($id == ""){
                throw new Exception($this->$errormessages["general_missingdata"]);
            }
    
            try{
                $sql = "GET SOME DATA FROM DB";
                //PDO execute
            }catch (PDOException $e) {
                throw new Exception($this->$errormessages["database_queryfailed"] . " SQL: " . $sql);
            }
    
            $this->projectdata = array();
            $this->projectdata["one"] = "cool";
            $this->projectdata["two"] = "verycool";
    
            if ($someerror){
                throw new Exception($this->$errormessages["handling_something"]);
            }
        }
    
        public function createSomeData(){
            try{
                $sql = "INSERT SOME DATA IN DB";
                //PDO execute
            }catch (PDOException $e) {
                throw new Exception($this->$errormessages["database_queryfailed"] . " SQL: " . $sql);
            }
        }
    }
    

    感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

如果您的代码库大约是10k行,那么你无法在两到三个类中填充(好吧,显然你可以,但这是一个糟糕的主意)。

首先,您应该在模板中提取HTML。 Twig是一个不错的选择,应该很好。但下一步可能是引入路由逻辑,这将允许您自动选择要呈现的模板。

关于您对OOP的一般理解,我建议您观看thisthis讲座。因为我有一种感觉,你并不真正理解OOP范式。

并且不要滥用extends个关键字。在OOP中有这个旧的引用:&#34;你应该赞成合成而不是继承&#34; 。这总结得很好。

关于错误处理,我几天前写过这篇文章,所以我只是懒惰并引导你去older post,简要介绍了常见的方法并触及了每个方法的一些缺点。 / p>

最后,为了处理DB:需要访问DB的每个类都应该在其构造函数中传递PDO(或MySQLi)的实例。如果您有多个此类,则阅读this post可能有助于共享该连接实例。