>我有一个项目愿意创建其文件,结构如下:
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);