PHP SQLite PDO-更改为静态



我创建了这段代码,在这里我创建了一个数据库实例并使用它。现在我正试图将代码转换为静态形式,但我做不到。

$pdo = new PDO('sqlite:src/chinook.db');

$sql = "CREATE TABLE IF NOT EXISTS uzivatele(
uzivatelId INTEGER PRIMARY KEY,
jmeno TEXT,
prijmeni TEXT,
body INTEGER
);";
$statement = $pdo->prepare($sql);
$statement->execute();
function dropTable($pdo,$name)
{
$sql = "DROP TABLE $name";
$statement = $pdo->prepare($sql);
$statement->execute();
}
...

static这就是我为pdo实现类的方式(根据手册(,我想实现静态方法,如createTable,但我不能重做

class Db
{
protected static $pdo = null;

public static function get(): PDO
{
return self::$pdo ?? (self::$pdo = new PDO(
'sqlite:hw-06.db',
null,
null,
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]
));
}
}
use AppDb;

class Account
{
...

public static function createTable(): void
{
$db = Db::get();
$sql = "CREATE TABLE IF NOT EXISTS uzivatele(
uzivatelId INTEGER PRIMARY KEY,
jmeno TEXT,
prijmeni TEXT,
body INTEGER
);";
$statement = $db->prepare($sql);
$statement->execute();
}

index.php帐户::createTable((;

如果你想实现一个简单的singleton,你可以使用;getInstance(("概念并与"__callStatic";以及";call_user_func_array";为了使PDO函数也是静态的,所有PDO和数据库类函数都将变成静态的:

<?php
declare(strict_types = 1);
/*
* PDO database class - only one connection alowed
*/
final class Database
{
/**
* @var PDO $connection The connection
*/
private $connection;
/**
* @var Database $instance The single instance
*/
private static $instance;
/**
* @var string $engine The engine of connection
*/
private $engine = 'sqlite:persistence.db'; // sqlite::memory:
/**
* @var array $options Default option to PDO connection
*/
private $options = [
PDO::ATTR_PERSISTENT => true,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false
];
/**
* Private constructor to prevent instance
* 
* @throws Throwable
* @return void
*/
private function __construct()
{
try {
$this->connection = new PDO($this->engine, null, null, $this->options);
}
catch (Throwable $error) {
error_log("{$error->getMessage()}");
}
}
/**
* Get an instance of the Database
* 
* @return PDO
*/
private static function getInstance(): PDO
{
// If no instance then make one
if (!self::$instance) {
self::$instance = new self;
}
return self::$instance->connection;
}
/**
* Transpiler of static methods for PDOStatements
* 
* @var string $method The PDO static method
* @var array $args
* @return string|PDOStatement
*/
public static function __callStatic(string $method, array $args)
{
return call_user_func_array(array(self::getInstance(), $method), $args);
}
/**
* Destroying PDO connection
* 
* @return void
*/
public function __destruct()
{
if (!empty($this->connection)) {
unset($this->connection);
}
}
/**
* Magic method clone is empty to prevent duplication of connection
*/
public function __clone() { }
public function __wakeup() { }
public function __toString() { }
}

在那里使用:

<?php
require_once __DIR__ . '/Database.php';
Database::exec('CREATE TABLE IF NOT EXISTS uzivatele (
uzivatelId INTEGER PRIMARY KEY,
jmeno TEXT,
prijmeni TEXT,
body INTEGER
);');
Database::exec("INSERT INTO uzivatele (jmeno, prijmeni, body) VALUES ('test', 'test', 1);");
var_dump(Database::lastInsertId());
$stmt = Database::prepare("SELECT * FROM uzivatele;");
$stmt->execute();
$data = $stmt->fetchAll();
var_dump($data);

注意,";prepared statments object";仍然像物体!

我认为将数据库连接作为静态连接使用没有任何问题,如果不并行使用,就没有问题,甚至可以减少与数据库创建许多连接的开销。但要小心,在某些情况下,这可能没有好处,因为在代码不是由CGI或FastCGI而是由包装器执行的情况下,它可能会导致速度减慢,甚至出现问题!

最新更新