该包已被放弃,不再维护。未建议替代包。

改进的PDO接口

1.2.1 2015-08-13 23:47 UTC

This package is not auto-updated.

Last update: 2024-09-07 10:04:45 UTC


README

⚠️ 注意:这个包已经很久没有维护了。因此,应将其视为“非常过时”。请勿使用它,并更新任何对该包的使用,以使用其他东西。

⚠️ 还要注意:该仓库将在2024年某个时候迁移。

PDOK:改进的PDO接口

你是否曾想过,如果PDO的API只是稍作调整,它会变得更加友好?

如果是这样,PDOK可能是适合你的。PDOK提供了与PDO和PDOStatement几乎完全兼容的类,但有一些增强功能

  • 流畅的接口
  • 按需连接,而不是实例化时连接
  • 断开连接和重新连接
  • 序列化、反序列化和克隆支持
  • 一致的方法名称(《PDO->execute()`,《PDOStatement->exec()`》)
  • 简短获取方法:fetchAssoc,《fetchNum》
  • 迭代支持 - 每个fetch方法都有一个相应的each方法,返回一个迭代器。

如果你已经使用《PDO::ERRMODE_EXCEPTION》,这应该可以作为直接替代品。如果你正在迁移现有的项目,请熟悉:ref:警告和:ref:限制部分。

需要PHP 5.4或更高版本,与HHVM兼容。

改进

PDOStatement的流畅接口(即使使用持久连接)

<?php
$pdo = new \PDOK\Connector('sqlite::memory:');
$pdo->prepare('SELECT * FROM mytable WHERE mycol=?')->execute(['yep'])->fetchAll();

PDO的流畅接口

<?php
$pdo->beginTransaction()
    ->execute('INSERT INTO foo VALUES(1, "yep");')
    ->execute('INSERT INTO foo VALUES(2, "yay");')
    ->commit();

PDO::ERRMODE_EXCEPTION始终使用

.. code-block:: php

<?php
$pdo = new \PDOK\Connector('sqlite::memory:');
try {
    $pdo->query("SOLOCT blergh FRAM gorgle");
}
catch (\PDOException $e) {
    echo "KABOOM!";
}

按需连接

.. code-block:: php

<?php
$pdo = new \PDOK\Connector('...')
assert($pdo->isConnected() == false);

$pdo->query("SELECT * FROM mytable");
assert($pdo->isConnected() == true);

或者你可以自己强制连接

.. code-block:: php

<?php
$pdo = new \PDOK\Connector('...');
$pdo->connect();
assert($pdo->isConnected() == true);

断开连接、重新连接、克隆和序列化

.. code-block:: php

<?php
$pdo->disconnect();
assert($pdo->isConnected() == false);

$pdo->connect();
$cloned = clone $pdo;
assert($pdo->isConnected() == true && $cloned->isConnected() == false);

$unserialized = unserialize(serialize($pdo));
assert($unserialized->isConnected() == false);

基于数组的静态构造函数

.. code-block:: php

<?php
$ini = <<<INI
dsn = "mysql:host=localhost"
user = "myuser"
pass = "mypass"
db = "hello"
options[PDO::MYSQL_ATTR_USE_BUFFERED_QUERY] = true
statements[] = "SET NAMES \"utf8\""
INI;

$settings = parse_ini_string($ini);
$pdo = \PDOK\Connector::create($settings);

方法命名一致性(选择你的毒药,但要坚持使用它)

.. code-block:: php

<?php
$pdo->exec('SELECT * FROM mytable');
$pdo->execute('SELECT * FROM mytable');

$stmt->exec();
$stmt->execute();

查询计数

.. code-block:: php

<?php
$pdo->execute('UPDATE mytable1 SET foo=1');
$pdo->execute('UPDATE mytable2 SET bar=1');
$pdo->prepare("UPDATE mytable3 SET baz=1")->execute();
assert($pdo->queries == 3);

简短获取方法

.. code-block:: php

<?php
$stmt = $connector->query("SELECT * FROM mytable");

// equivalent
$stmt->fetchAssoc();
$stmt->fetch(\PDO::FETCH_ASSOC);

// equivalent
$stmt->fetchNum();
$stmt->fetch(\PDO::FETCH_NUM);

每个《fetch》方法都有一个相应的《each》方法

.. code-block:: php

<?php
foreach ($stmt->eachAssoc() as $row) {
    // stuff
}
foreach ($stmt->eachNum() as $row) {
    // stuff
}
foreach ($stmt->each(\PDO::FETCH_ASSOC) as $row) {
    // stuff
}

接口!如果你想创建自己的语句类,请实现《PDOK\StatementInterface》并使用《PDOK\StatementTrait》

.. code-block:: php

<?php
class MyStatement implements \PDOK\StatementInterface
{
    use \PDOK\StatementTrait;

    /* ... */
}

.. _limitations

限制

  • 您只能为《PDO::ERRMODE_EXCEPTION》使用《PDO::ATTR_ERRMODE》。

  • 许多方法在失败时返回布尔值而不是流畅。这是一个尚未做出的决定 - 我倾向于让它们引发异常而不是返回错误消息,例如“尝试在非对象上调用函数execute()”,这并不符合开发人员的友好性。

.. _caveats

警告

  • 只要不使用类型提示,PDOK应该与原始PDO向后兼容。您可以将现有的PDO类型提示替换为对《PDOK\Functions::ensurePDO($pdo)》的调用,并将现有的《PDOStatement》提示替换为对《PDOK\Functions::ensureStatement($stmt)》的调用。

  • PDOK不按需连接。如果你的代码需要在实例化时建立连接,你将需要修改它以直接调用《PDOK\Connector->connect()`》。