首先,将构造函数私有化(禁止其他程序创建类的对象)
其次,在本类中自定义一个对象(禁止其他程序创建类的对象就要自己创建一个,否则就不是单例了)
最后,提供一个可访问类自定义对象的类成员方法(对外提供该对象的访问方式)。
也就是说,你不能用该类在其他地方创建对象,而是通过类提供的方法访问类中的那个自定义对象。
那么关键来了,使用类中方法只有两种方式,①创建类的一个对象,用对象去调用方法;②使用类名直接调用类中方法。
显然第一种情况不能用,只能使用第二种方法。而想要使用类名直接调用类中方法,类中方法必须是静态的,而静态方法不能访问非静态成员变量,因此类自定义的实例变量也必须是静态的。这就是为什么单例模式的唯一实例为什么设置为静态的。
实例:
<?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();
?>
本文详细介绍了PHP中实现单例模式的方法,包括构造函数私有化、类内部自定义对象及提供静态方法获取实例的过程。并通过一个数据库连接类的具体实例展示了如何确保整个应用中只有一个实例存在。

3462

被折叠的 条评论
为什么被折叠?



