首先,我们来看一个完整的、规范的、简单的单例模式的例子:
class User {
//静态变量保存全局实例
private static $_instance = null;
//私有构造函数,防止外界实例化对象
private function __construct() {
}
//私有克隆函数,防止外办克隆对象
private function __clone() {
}
//静态方法,单例统一访问入口
static public function getInstance() {
if (is_null ( self::$_instance ) || !isset ( self::$_instance )) {
self::$_instance = new self ();
}
return self::$_instance;
}
public function getName() {
echo 'hello world!';
}
}
$user = User::getInstance();
?>
下面回答问题:
1、你可以随便改你所谓的单例模式类,但是单例的核心是不能变的:产出一个实例;每次使用同一个实例对象;;如果你把private改成protected可以,但是这就无限实例了不是吗?不符合单例模式的设计规范呀;
2、这就是php的变量生命周期问题了。php所有的变量生命周期,一般情况下只存在于请求开始->请求结束,每次请求每个变量重新被赋值,每个对象被重新实例化;请求结束,自动释放;单例模式的的意义是:对象只被实例化一次,每次调用返回同一个实例;你的单例的生命周期只存在于这一请求过程中,请求结束,就没了。再次请求,从新生成新的单例;没毛病呀
3、滥用什么服务都会造成不好的影响;就你现在举这个例子而言,对数据库链接使用单例模式的话,每次使用的时候,都是用的同一静态内存区(类中static声明的变量默认保存在静态内存区中)的变量,所以只要实例化一次,之后在同一请求中使用的时候,就不会增加额外的数据库连接对象了。
而你说的连接池指的是数据库的连接池吧,这个连接池是有内存限制,也有最大,最小连接限制,而且是可以在mysql的配置文件中设置的。具体请参考《MySql数据库连接池专题》的介绍。
4、对TP的源码没看过,不方便回答。
以上。