2009-08-22 53 views
0

我有一个CORE类只适用于我的特定站点,即它执行站点特定的功能。我有一个数据库类(用于MySQL)和其他类,如访问,验证,上传,模板等等......我知道php类只能扩展一个类,所以几乎所有的类都扩展了数据库类。我正在查看Twitter API上使用的公共Twitter类。在其中,有几个函数可以做直接访问网站,插入,删除等任何事情......我应该把所有网站相关函数放在我的Core类中,并且保持它不在我的脚本的一般范围内。现在,我有这样的事情....是一个网站PHP站点所必需的一般类吗?

这里有一个例子,作为现在我有功能,如

$core = new Core(); 
$core->get_user_info($user_id); 
$core->get_user_articles($user_id); 

内部的功能,我进行数据库查询来选择所需要的信息,所以我不必须直接做,因为它会变得混乱。

我也有功能进行删除的东西,比如

$core->Delete_Article($article_id); 

不过,我不具备的功能插入。相反,我直接使用Database类来添加信息,就像这样。

$article = array(user_id => $_SESSION['user_id'], body => $_POST['body']); 
$db = new Database(); 
$db->Insert($article, 'articles'); 

$user = array(name => $_POST['name'], email => $_POST['email']); 
$db->Insert($user, 'users'); 

现在,从另外一个方面的分离的话题,我应该把我的数据库选择/插入/更新/删除我一般核心类内查询和做在后台执行所有数据库操作

与$ db-> Insert()类似,我可以使用$ core-> insert_user()或继续执行。

回答

2

对于新面向对象编程的人来说,这是一个相当常见的错误。你不想仅仅因为它有一些你需要的功能而扩展一个类。事实上,你可能想在开始时避免扩展课程。尽管OOP的大多数介绍对继承有很大的影响,但我现在会明确指出。

相反,想想如何按照使用方式将功能组合在一起。例如,假设你在管理用户。你需要跟踪用户信息,添加用户,删除它们,等等。你可以像这样创建类:

class User { 
    function getName()... 
    function getID()... 
} 
class UserAdmin { 
    function addUser(User $user)... 
    function getUser($id)... 
    function deleteUser($id)... 
} 

这些类是根据概念不是根据什么功能,你需要调用组织。

当你需要需要可重复使用的功能,如数据库访问,你通常会希望另一个单独的对象做这项工作。因此,而不是让你的UserAdmin类延长一个数据库类来格式化它的SQL:

// wrong 
class UserAdmin extends Database { 
    function getUser($id) { 
    $this->openConnection(); 
    $this->runQuery("select * from users where id = {1}", $id); 
    } 
} 

...你可以只使用您UserAdmin类中的数据库类:

// right 
class UserAdmin { 
    function getUser($id) { 
    $db = new Database(); 
    $db->openConnection(); 
    $db->runQuery("select * from users where id = {1}", $id); 
    } 
} 
class Database { 
    function openConnection() ... 
    function runQuery() ... 
} 

最初它看起来像更多的工作,但它使您的各个类独立。这使得他们更容易编写,维护和测试。

0

因为PHP正在重新加载在每个页面视图上的所有内容,所以我没有发现实例化类的好处。如果您将功能分解为与数据库模式大致相同的文件,则可以向上和向下扩展,而无需添加每个页面命中加载的越来越多的功能。

当你有几十个或几百个表/类时,它很重要。

专门为PHP,我们更喜欢这种风格:

class Member 
{ 
    public static function Insert($aData) 
    { 
     //Insert member and return ID 
    } 
    public static function Select($Member_ID) 
    { 
     //select member and return Array 
    } 

    public static function List($aFilter) 
    { 
     //Return list of members filtered by specific criteria 
    } 
} 

把它一步,我们有一个静态类App持有相关“singletonish”变量。

class App 
{ 
    public static $DB = NULL; 
} 

App::$DB = new Connection(); 

现在,在您的应用程序的任何地方,你可以说:

App::$DB->Query(...); 
0

一般情况下,我要做的就是添加一个简单的查询()方法来我的数据库类,它只是需要SQL是一种说法。然后,我将所有通用的CRUD方法抽象为特定的类。所以如果你有一个Article类,那么deleteArticle()方法就会进入这个类,并且会扩展Article类和数据库类。在该类中使用$ db-> query($ sql)。和其他班级一样......