I’m reading up on php design patterns, and I saw this code:
<?php
require_once("DB.php");
class DatabaseConnection
{
public static function get()
{
static $db = null;
if ( $db == null )
$db = new DatabaseConnection();
return $db;
}
private $_handle = null;
private function __construct()
{
$dsn = 'mysql://root:password@localhost/photos';
$this->_handle =& DB::Connect( $dsn, array() );
}
public function handle()
{
return $this->_handle;
}
}
print( "Handle = ".DatabaseConnection::get()->handle()."\n" );
print( "Handle = ".DatabaseConnection::get()->handle()."\n" );
?>
I understand it all except the last two print statements. I’ve been messing around with it, but I don’t understand the static function somehow calling a public non-static function.
I’ve notice I can do:
DatabaseConnection::get()->get()->get()->handle();
but I can’t so something like:
DatabaseConnection::get()->handle()->get();
I just don’t understand what this is doing, other than calling the get function then calling the handle function.
This works because the static function returns a new object. This type of construction is typically referred to as a Singleton, since it is attempting to enforce that only one instance of a
DatabaseConnectionis ever available.Notice that the constructor is private, so you cannot explicitly call
new DatabaseConnection()unless you are already inside the class. Solutions utilizing a Singleton will have a property, initally null, that is then set to a non-null value upon object instantiation. The ‘getInstance’ (orgetin this case) method will only return a new object if the property is null.