继承 PHP PDO 类是很好的做法吗?



>我有一个项目愿意创建其文件,结构如下:

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 User extends DBLayer
{
}

所以,我的问题在这里:在性能、代码重用/可读性方面,这是很好的做法吗(项目将来可能会邀请其他开发人员)?

一般来说,没有。

继承适用于 IS-A 关系。当您希望类的所有方法都可供其扩展类使用时,您应该继承。

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

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

换句话说,通过授予对 query() 等通用方法的访问权限,您可以允许某人使用 User 对象来查询任何不相关的数据。那将是非常令人困惑的!

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

在这种情况下,您应该优先选择组合而不是继承。每个域模型类都应该是 HAS-A PDO 对象,这将使您有机会避免在每个类中重复代码。

因此,您的用法将是:

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

最新更新