继承PHP PDO类是一种好习惯

时间:2014-03-03 01:07:17

标签: php inheritance pdo code-reuse code-readability

我有一个项目愿意创建像这样结构化的文件:

js
css
images
core
--- dblayer.class.php
--- user.class.php
--- comments.class.php
--- etc.class.php
index.php
users.php 

DBLayer类继承自PDO,如下所示:

class DBLayer extends PDO
{
    public function __construct()
    {
        $options = array(
            PDO::ATTR_PERSISTENT => true,
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        );

        $dsn = DB_DRIVER . ":host=" . DB_HOST . ";dbname=" . DB_NAME;
        parent::__construct($dsn, DB_USER, DB_PASSWORD, $options);
    }

    public function getLastId()
    {
    }

    public function getLastError()
    {
    }

    // Other general methods used frequently by other classes
}

其他类将继承自DBLayer class:

class User extends DBLayer
{
}

所以,我的问题是:这是性能,代码重用/可读性方面的良好实践(项目未来可能邀请其他开发人员)?

1 个答案:

答案 0 :(得分:5)

一般来说,没有。

继承适用于IS-A关系。当你希望 all 类的方法可以被扩展类使用时,你应该继承。

您是否希望调用代码能够执行此操作:

$user = new User('mysql:host=localhost;dbname=test', $user, $password);
$stmt = $user->query("SELECT * FROM Comments");

换句话说,通过访问query()等通用方法,您可以允许某人使用User对象查询任何不相关的数据。那会很混乱!

正如@zerkms在评论中所说,“用户不是数据库[连接]”。这就是用户IS-A PDO 所暗示的内容。

这是你应该favor composition over inheritance的情况。每个域模型类都应该 HAS-A PDO对象,这样可以避免在每个类中重复代码。

因此您的用法是:

$pdo = new PDO(...);
$user = new User($pdo);