shabbyrobe / pdok
改进的PDO接口
Requires
- php: >=5.4
Requires (Dev)
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()`》。