Using singletons
in PHP is considered bad practice. From my experience the most problematic issue with them are unit tests. It is hard to ensure that two tests are independent when testing singletons.
I would delegate the responsibility for the constraint "only one instance should exists" to the code which creates the Db object.
Also for me it looks like there is a misunderstanding in how Singletons work in PHP in contrast to other languages: If you have 10.000 concurrent requests for example, then each request runs in a separate PHP process or thread, meaning they will all have their own instance of the "singleton", there is no sharing of this object for more than a single request (when running PHP in common web backend scenarios)
There is no "connection pooling" in PHP, but you can use mysqli
persistent connections for mysql. It can be achieved by passing the p:
in front of the hostname when creating mysqli. This might help here, but handle it with care (meaning read the documentation first)
However, just for theory, a singleton in PHP must be aware of the fact that someone could use clone
. Meaning in your case it would be possible to do that:
$db = DB::getInstance();
$db2 = clone $db;
To avoid that you can implement the __clone()
method like this:
public function __clone() {
throw new Exception("Can't clone a singleton");
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…