我正在阅读php设计模式,我看到了这段代码:
<?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" );
?>
我理解除了最后两个印刷语句之外的所有内容。我一直在搞乱它,但我不理解静态函数以某种方式调用公共非静态函数。
我注意到我能做到:
DatabaseConnection::get()->get()->get()->handle();
但我不能这样:
DatabaseConnection::get()->handle()->get();
除了调用get函数然后调用handle函数之外,我只是不明白这是做什么的。
答案 0 :(得分:3)
这是有效的,因为静态函数返回一个新对象。这种类型的构造通常被称为Singleton,因为它试图强制只有DatabaseConnection
的一个实例可用。
请注意,构造函数是私有的,因此除非您已经在类中,否则无法显式调用new DatabaseConnection()
。使用Singleton的解决方案将具有一个属性,初始为null,然后在对象实例化时设置为非null值。 &#39; getInstance&#39; (或者在这种情况下为get
)方法仅在属性为null时才返回新对象。
答案 1 :(得分:1)
DatabaseConnection::get()
创建DatabaseConnection
的实例并将其返回。
所以......
DatabaseConnection::get()->handle();
......也可以写成如下......
$db = DatabaseConnection::get();
$db->handle();