最好在创建对象时确定对象的规格,听起来您的对象规格与您选择的模式不匹配。
一般来说,你应该问自己,“我只需要一个对象的一个实例(静态)还是多个?”
对于此特定实例(连接并查询数据库),除非您需要建立与数据库的多个连接,否则不建议为数据库对象实例化对象。
因此,您有一个实例化对象与静态对象的用例。多个并发连接可能会使数据库过载,具体取决于配置以及在单次执行中创建连接的次数。
因此,考虑到这一点,有几种用于 PHP 的 OOP 设计“模式”可用于帮助对象/s 的体系结构。请参阅http://www.slideshare.net/RobertGonzalez/object-orientated-design-patterns-for-php-presentation了解更常见的模式。
对于一个工作示例http://ideone.com/6qxvqx
请注意,我将 mysqli 重命名为 mysqli2 并创建了一个假类来处理查询,并为连接和对象创建添加了一些跟踪。
<?php
interface iDatabase
{
static public function execute();
public function instantiatedExecute();
}
abstract class database implements iDatabase
{
protected static $conn;
/**
* create an instance of database that uses the same connection across all instances
*/
final public function __construct()
{
self::connect();
}
/**
* Connect to a database if not already connected
*/
final protected static function connect()
{
if (null === self::$conn || false === (self::$conn instanceof mysqli)) {
self::$conn = new mysqli( /* DB info */ );
//add error checking here...
}
return self::$conn;
}
/**
* query database connection
*/
final public function query($query)
{
return self::doQuery($query);
}
/**
* static query database connection
*/
final public static function doQuery($query)
{
//sanitize query here if desired
return self::connect()->query($query);
}
}
class example extends database
{
/**
* example specific static execution
*/
public static function execute($query)
{
self::doQuery($query);
}
/**
* example specific non-static execution
*/
public function instantiatedExecute($query)
{
$this->query($query);
}
}