Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
继承PHP PDO类是一种好的做法吗_Php_Inheritance_Pdo_Code Reuse_Code Readability - Fatal编程技术网

继承PHP PDO类是一种好的做法吗

继承PHP PDO类是一种好的做法吗,php,inheritance,pdo,code-reuse,code-readability,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 class DBLayer extends PDO { public function __construct() { $options = array(

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

js
css
images
core
--- dblayer.class.php
--- user.class.php
--- comments.class.php
--- etc.class.php
index.php
users.php 
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
类继承自
PDO
,如下所示:

js
css
images
core
--- dblayer.class.php
--- user.class.php
--- comments.class.php
--- etc.class.php
index.php
users.php 
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()之类的通用方法,您允许某人使用用户对象查询任何不相关的数据。那太令人困惑了

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

在这种情况下,你应该这样做。您的每个域模型类都应该有一个PDO对象,这将使您有机会避免在每个类中重复代码

因此,您的用法是:

$pdo = new PDO(...);
$user = new User($pdo);
一般来说,没有

继承适用于is-A关系。当您希望一个类的所有方法都能被其扩展类使用时,应该继承

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

$user = new User('mysql:host=localhost;dbname=test', $user, $password);
$stmt = $user->query("SELECT * FROM Comments");
换句话说,通过访问诸如query()之类的通用方法,您允许某人使用用户对象查询任何不相关的数据。那太令人困惑了

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

在这种情况下,你应该这样做。您的每个域模型类都应该有一个PDO对象,这将使您有机会避免在每个类中重复代码

因此,您的用法是:

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

不是。用户不是数据库。是的,我知道,但是我用它来不重复每一个类中的相同代码。@ a a d d:什么样的重复?你可以考虑用A代替。不是。用户不是数据库。是的,我知道,但是我用它来不重复每一个类中的相同代码。@ a a d d:什么样的重复?你可以考虑用A代替。