因此想防止外部的不断进行实例化对象,对其析构方法(__construct())进行"保护":即protected,让外部不能直接进行实例化
思考:外部不能实例化该类,相当于关闭了一扇门,那么要打开一个出口进行该类的实例化!!而且应该在该类被继承(或者该类被克隆)之后还是一个对象
思路:
1,先定义一个普通的类
2,封锁外部 new 操作3,打开一个接口(唯一的路径) 可以进行 new 对象
4,在唯一的开放方法中,先进行判断
5,使用 final 来防止继承时,被修改权限(final:在方法前加上final,则该类被继承时内的方法不能被覆盖,若是类前加final,则该类不能被继承)
6,防止被克隆
<?php
header("content-type:text/html;charset=utf-8");
class Single{
protected static $ins=null;
public static function getIns(){
if (self::$ins==null) {
self::$ins=new single();
}
return self::$ins;
}
final protected function __construct(){
}
protected function __clone(){
}
}
/*//证明继承之后依然是同一个对象
class Mi extends Single {
}
$g1 = Mi::getIns();
$g2 = Mi::getIns();
if ($g1===$g2) {
echo " 是一个对象 ";
}else{
echo " 不是一个对象 ";
}*/
/* $g1 = Single::getIns();
$g2 = clone $g1;//已经可以证明不能被克隆
if ($g1===$g2) {
echo " 是一个对象 ";
}else{
echo " 不是一个对象 ";
}*/
$g1 = Single::getIns();
$g2 = Single::getIns();
if ($g1===$g2) {
echo " 是一个对象 ";
}else{
echo " 不是一个对象 ";
}
?>