我有一个项目愿意创建像这样结构化的文件:
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
{
}
所以,我的问题是:这是性能,代码重用/可读性方面的良好实践(项目未来可能邀请其他开发人员)?
答案 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);