单例模式两个重点__construct 私有化 防止new 实例 __clone防止复制实例
__construct 私有化就不能new 对象了,因为new 关键字会自动触发__construct 函数,私有化后不能触发报错,所以就不能new了
__clone() 方法不能够直接被调用,只有当通过 clone 关键字克隆一个对象时才可以使用该对象调用 __clone() 方法。当创建对象的副本时,PHP 会检查 __clone() 方法是否存在。如果不存在,那么它就会调用默认的 __clone() 方法,复制对象的所有属性。如果 __clone() 方法已经定义过,那么 __clone() 方法就会负责设置新对象的属性。所以在 __clone() 方法中,只需要覆盖那些需要更改的属性就可以了。
<?php
/**
* 单例模式 2010-06-06 sz
* @author phppan.p#gmail.com http://www.phppan.com
* 哥学社成员(http://www.blog-brother.com/)
* @package design pattern
*/
/**
* 懒汉式单例类
*/
class Singleton {
/**
* 静态成品变量 保存全局实例
*/
private static $_instance = NULL;
/**
* 私有化默认构造方法,保证外界无法直接实例化
*/
private function __construct() {
}
/**
* 静态工厂方法,返还此类的唯一实例
*/
public static function getInstance() {
if (is_null(self::$_instance)) {
self::$_instance = new Singleton();
}
return self::$_instance;
}
/**
* 防止用户克隆实例
*/
public function __clone(){
die('Clone is not allowed.' . E_USER_ERROR);
}
/**
* 测试用方法
*/
public function test() {
echo 'Singleton Test!';
}
}