我该如何设置课程?

时间:2009-08-27 02:52:27

标签: php mysql oop organization

我开始使用oop来构建用户生成数据的网站。

我的课程有不同类型的数据。 我有从数据库中获取数据列表的函数,以及从这些列表中选择一个项目的函数。 例如

function Get_Article($aid); //Gets an article
function Get_Users_Articles($uid); //Gets a multidemsional array of the users 
                                   //articles
function Get_Latest_Articles(); //Self explanatory by now
function Get_Local_Articles($zip); //Gets articles written by local users
function Get_Local_Users($zip); //Gets all local users

function Get_All_Article_Comments($aid); //Gets a multidimensional array of the 
                                     //comments written for an article
function Get_Article_Comment($cid); //Gets a single article comment

现在,我应该如何设置我的类来组织这些功能。 我应该将它们全部放在同一个类中,还是应该从文章中分离出来的评论,或者分离从检索文章/评论列表的那些文章/评论中检索单个文章/评论的函数。我可能会在以后添加更多内容以允许评论,所以我想考虑从其他人那里分离所有评论功能。此外,“本地”函数都使用相同的函数执行数学运算,所以我应该将它们组合在一起,或者只是使用继承...任何建议???

关于oop的主题,我有一个看起来像......的用户类     private $ user = array();

public function Get_User_Data($uid){
  //get user data from database
  return $this->user;
}

public function Set_User_Data($user_array){
  $this->user = $user_array;
}

public function Add_User(){
  //INSERT data from $this->user into the database 
}

现在有人看到这看起来有什么问题吗,大多数情况下,我应该将user_data设置为Add_User函数的参数,而不是插入成员变量吗?

1 个答案:

答案 0 :(得分:6)

首先,您需要了解采用旧的过程样式函数并将它们包装在对象内部并不会使您的代码面向对象,这只意味着您正在编写更复杂且非常难看的过程代码。

其次我强烈建议,实际上我在建议中不能太费劲,你需要花一些时间来至少研究那里的各种PHP框架。虽然你可能永远不会使用它们中的任何一个,但我觉得非常安全,保证学习其中任何一个都能让你更好地掌握面向对象的原则和一般的应用程序设计。如果您以前从未见过任何事情,以下内容应该提供一个起点:

  • Zend Framework
  • Symfony的
  • CakePHP的
  • Solar Framework

此外,如果您从未听说过Martin Fowler或企业应用程序架构模式,我强烈建议您尝试选择副本。他从字面上写了这本书,它提供了在每个流行的Web框架中使用的基本模式。

我的'阅读手册回复'非常多:-P

在您的特定情况下,我将从基本的Active Record模式开始,以包含您的数据库访问逻辑和您的域逻辑。在这种类型的模式中,每个数据库表(用户,文章,注释)由离散对象表示。用户的基本Active Record类将包含获取特定用户或用户列表的所有功能,以及插入,更新或删除用户的功能。此外,User Active Record类将包含加载用户文章和注释的方法。

shell User类可能如下所示:

class User extends Active_Record {

public function find() {}

/**
    Single function performs inserts and updates for the object
**/
public function save() {}

public function delete() {}

public function getArticles() {}

public function getComments() {}
}