オブジェクトを作成するときにオブジェクトの仕様を決定するのが最善ですが、オブジェクトの仕様が選択したパターンと一致していないように思えます。
通常、「オブジェクト (静的) のインスタンスが 1 つだけ必要なのか、それとも複数必要なのか?」と自問する必要があります。
この特定のインスタンス (データベースに接続してクエリを実行する) では、データベースへの複数の接続を確立する必要がない限り、データベース オブジェクトのインスタンス化されたオブジェクトを持つことはお勧めできません。
したがって、インスタンス化されたオブジェクトと静的オブジェクトのユースケースがあります。構成と、1 回の実行で接続が作成される回数によっては、複数の同時接続によってデータベースが過負荷になる可能性があります。
そのことを念頭に置いて、オブジェクトのアーキテクチャを支援するために利用できる PHP 用の OOP 設計「パターン」がいくつかあります。より一般的なパターンの詳細については、 http://www.slideshare.net/RobertGonzalez/object-directional-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);
}
}