是PHP站点所必需的通用类吗?

时间:2009-08-22 01:34:58

标签: php oop

我有一个仅与我的特定网站有关的CORE类,即它执行特定于站点的功能。我有一个数据库类(用于mysql),以及其他类,如访问,验证器,上传,模板等...我知道php类每个只能扩展一个类,所以我的几乎所有类都扩展了数据库类。我正在查看twitter API上使用的公共twitter类。在其中,有一些功能可以通过直接访问网站,插入,删除,等等来完成您可以做的几乎所有事情......我应该将所有网站关联功能放在我的Core类中并使其远离我的脚本的一般范围。现在我有这样的事情......

这是一个例子,现在我有像

这样的功能
$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');

现在,在一个方面与另一个方面分离的主题中,我应该将所有数据库选择/插入/更新/删除查询放在我的常规CORE类中,并在后台执行所有数据库操作

而不是$ db-> Insert(),我可以使用$ core-> insert_user()或者继续我正在做的事。

3 个答案:

答案 0 :(得分: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() ...
}

最初它似乎更多的工作,但它保持你的各种类独立。这使它们更容易编写,维护和测试。

答案 1 :(得分: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,它包含相关的“单一”变量。

class App
{
    public static $DB = NULL;
}

App::$DB = new Connection();

现在,您可以在应用中的任何位置说:

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

答案 2 :(得分:0)

通常,我所做的是在我的数据库类中添加一个简单的query()方法,它只是将SQL作为参数。然后我将所有常规CRUD方法抽象到特定类。因此,如果您有一个Article类,则deleteArticle()方法将进入该类,并将使用数据库类扩展Article类。在该类中使用$ db-> query($ sql)。等等你的其他课程......