首先,将构造函数私有化(禁止其他程序创建类的对象)
其次,在本类中自定义一个对象(禁止其他程序创建类的对象就要自己创建一个,否则就不是单例了)
最后,提供一个可访问类自定义对象的类成员方法(对外提供该对象的访问方式)。
也就是说,你不能用该类在其他地方创建对象,而是通过类提供的方法访问类中的那个自定义对象。
那么关键来了,使用类中方法只有两种方式,①创建类的一个对象,用对象去调用方法;②使用类名直接调用类中方法。
显然第一种情况不能用,只能使用第二种方法。而想要使用类名直接调用类中方法,类中方法必须是静态的,而静态方法不能访问非静态成员变量,因此类自定义的实例变量也必须是静态的。这就是为什么单例模式的唯一实例为什么设置为静态的。
实例:
<?php
/**
* 单例模式
**/
class Db
{
//保存全局实例
private static $instance;
//数据库连接句柄
private $db;
//数据库连接参数
const HOSTNAME = "127.0.0.1";
const USERNAME = "root";
const PASSWORD = "passwd";
const DBNAME = "dbname";
//私有化构造函数,防止外界实例化对象
private function __construct()
{
$this->db = mysqli_connect(self::HOSTNAME,self::USERNAME,
self::PASSWORD,self::DBNAME);
}
//私有化克隆函数,防止外界克隆对象
private function __clone()
{
}
//单例访问统一入口
public static function getInstance()
{
if(!(self::$instance instanceof self))
{
self::$instance = new self();
}
return self::$instance;
}
//数据库查询操作
public function getinfo()
{
$sql = "select * from tablename";
$res = mysqli_query($this->db,$sql);
while($row = mysqli_fetch_array($res)) {
echo $row['colname'] . '<br />';
}
mysqli_free_result($res);
}
}
$mysqli = Db::getInstance();
$mysqli->getinfo();
?>