Php PDO类-这在技术上正确吗?

Php PDO类-这在技术上正确吗?,php,class,pdo,Php,Class,Pdo,我在Philip Brown的网站上找到了以下PDO课程 我是新来上课的。这很有效。是否有人认为它有什么问题,或者可以改进?我想在大规模应用中使用它 class Database { private $host = DB_HOST; private $user = DB_USER; private $pass = DB_PASS; private $dbname = DB_NAME; private $dbh; private $error; private $stmt; public f

我在Philip Brown的网站上找到了以下PDO课程

我是新来上课的。这很有效。是否有人认为它有什么问题,或者可以改进?我想在大规模应用中使用它

class Database
{
private $host = DB_HOST;
private $user = DB_USER;
private $pass = DB_PASS;
private $dbname = DB_NAME;

private $dbh;
private $error;

private $stmt;

public function __construct()
    {
    // Set DSN
    $dsn     = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname;
    // Set options
    $options = array(
        PDO::ATTR_PERSISTENT => true,
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    );
    // Create a new PDO instanace
    try
        {
        $this->dbh = new PDO($dsn, $this->user, $this->pass, $options);
        }
    // Catch any errors
    catch (PDOException $e)
        {
        $this->error = $e->getMessage();
        }
    }


public function query($query)
    {
    $this->stmt = $this->dbh->prepare($query);
    }

public function bind($param, $value, $type = null)
    {
    if (is_null($type))
        {
        switch (true)
        {
            case is_int($value):
                $type = PDO::PARAM_INT;
                break;
            case is_bool($value):
                $type = PDO::PARAM_BOOL;
                break;
            case is_null($value):
                $type = PDO::PARAM_NULL;
                break;
            default:
                $type = PDO::PARAM_STR;
        }
        }
    $this->stmt->bindValue($param, $value, $type);
    }


public function execute()
    {
    return $this->stmt->execute();
    }

public function resultset()
    {
    $this->execute();
    return $this->stmt->fetchAll(PDO::FETCH_ASSOC);
    }

public function single()
    {
    $this->execute();
    return $this->stmt->fetch(PDO::FETCH_ASSOC);
    }

public function rowCount()
    {
    return $this->stmt->rowCount();
    }

public function lastInsertId()
    {
    return $this->dbh->lastInsertId();
    }

public function beginTransaction()
    {
    return $this->dbh->beginTransaction();
    }

public function endTransaction()
    {
    return $this->dbh->commit();
    }

public function cancelTransaction()
    {
    return $this->dbh->rollBack();
    }


public function debugDumpParams()
    {
    return $this->stmt->debugDumpParams();
    }

}

在我看来,您应该坚持使用本地PDO类。本教程中的数据库类不提供任何额外功能,实际上减少了它。比如说

public function single()
{
$this->execute();
return $this->stmt->fetch(PDO::FETCH_ASSOC);
}
仅将返回的数据类型限制为数组,而原始PDO类有8种不同的获取样式,您可以根据自己的喜好和需要使用

在下面的代码中,我也看不到任何合适的地方

public function beginTransaction()
{
return $this->dbh->beginTransaction();
}
只需使用相同名称为完全相同的函数进行包装,同样没有额外的功能

此外,该类限制您创建多个准备好的语句-使用原始PDO类,您可以执行以下操作:

$stmt1 = $db->prepare('SELECT * FROM foo');
$stmt2 = $db->prepare('SELECT * FROM bar');
...
$stmtn = $db->prepare('SELECT * FROM foobar');
使用教程中提供的类无法完成此操作-语句对象硬编码为单个类变量

最后,我并不赞成这个类的函数命名。函数名应该像一个简短的描述,但像“single”和“resultset”这样的名称实际上并没有提供任何类型的信息,即特定函数的作用、返回或它如何影响程序的整体状态

总而言之,在我看来,这个类设计得相当糟糕,与本机PDO实现相比没有任何优势

有什么问题吗

一切。即

private $host = DB_HOST;
为DB凭证使用类变量是完全没有意义的。它们仅在构造函数中使用一次

catch (PDOException $e)
没有什么意义。捕获的错误没有使用,这破坏了异常的概念

类的其余部分只是模拟PDO功能

与原始PDO的唯一区别是它可以让您自动将PDO空值绑定到DB空值。然而,我怀疑你是否有这样做的想法


因此,像其他人一样,我建议你放弃这门课和这本教程特别是如果你是新来上课的。这样的例子会破坏你的整个体验。

这有什么意义?为什么不直接调用PDO类呢?您遵循的教程没有任何意义。对于它所具有的一点点功能,为什么不首先简单地从PDO继承呢?我不会用那个教程的,谢谢。这正是我想要的反馈。最近刚开始学习PDO,仍然很难掌握课程。仍然在研究我是否需要一门课程来连接。看起来,如果我想使用多个数据库,那么我可能至少需要这样做。谢谢您的回复。@Coder对不止一个数据库的需求和“至少”之间有什么关系?您是否误以为不能将原始PDO也用于多个数据库?您可以使用PDO的多个数据库连接,但本教程中提供的数据库类只能连接由DB_*常量定义的连接参数。这是使用此类时的另一个限制。