用户
 找回密码
 入住 CI 中国社区
搜索
查看: 2870|回复: 2
收起左侧

[HELP] Base5.php文件中的类是什么意思啊 有什么作用啊??

[复制链接]
发表于 2011-8-5 00:42:03 | 显示全部楼层 |阅读模式
PHP复制代码
class CI_Base {
 
        private static $instance;
 
        public function CI_Base()
        {
                self::$instance =& $this; //主要是此处 不明白,此构造函数中给静态变量赋值,但是赋的值是$this的地址么,此处$this 是只得什么呢 是这个类本身么  这样有什么作用啊???
        }
 
        public static function &get_instance()
        {
                return self::$instance;
        }
}
复制代码
发表于 2011-8-5 10:16:15 | 显示全部楼层
楼主试试搜搜:单例模式
另外&get_instance()这个函数是CI扩展的重要函数。
 楼主| 发表于 2011-8-5 11:45:49 | 显示全部楼层
为什么要采用单例模式:
单例模式被当作职责模式,他用来在应用程序中创建一个单一的功能访问点。它将创建对象的控制权委托到一个单一的访问点上。在任何时候,应用程序中都只会有这个类仅有的一个实例存在 。这可以防止我们去打开数据库的多个连接或者不必要得使用多余的系统资源。在更加复杂的系统中,使用单例模式在维持应用程序状态的同步方面也尤其有用。

单例模式要点如下:

1. $instance 必须声明为静态的私有变量
2. 构造函数和克隆函数必须声明为私有的,这是为了防止外部程序 new 类从而失去单例模式的意义
3. getInstance()方法必须声明为公有的,必须调用此方法以返回唯一实例的一个引用
4. ::操作符只能访问静态变量或静态函数
5. PHP的单例模式是相对而言的,因为PHP的解释运行机制使得每个PHP页面被解释执行后,所有的相关资源都会被回收。
也就是说,PHP在语言级别上没有办法让某个对象常驻内存。在PHP中,所有的变量都是页面级的,无论是全局变量,还是类的静态成员,都会在页面执行完毕后被清空 ,结果会重新建立新的对象,这样也就完全失去了Singleton的意义。不过,在实际应用中同一个页面中可能会存在多个业务逻辑,这时单例模式就起到了很重要的作用,有效的避免了重复new 对象(注: new 对象会消耗内存资源)这么一个行为,所以我们说PHP的单例模式是相对而言 的。

<?php
class MyDBClass
{
    public $db;
    static private $instance;            //静态成员变量,保存全局实例
   
    private function __construct($dbHost,$dbName,$dbUser,$dbPwd,$charset='utf8')        //私有化构造函数,防止外界实例化对象
    {
        $this->db=new mysqli($dbHost,$dbUser,$dbPwd,$dbName) or die ('Could not connect:'.mysqli_connect_error());
        mysqli_set_charset($this->db,$charset);
    }
    private function __clone(){ }        //私有化克隆函数,防止外界克隆对象
   
    public static function get_instance($dbHost,$dbName,$dbUser,$dbPwd,$charset)        //静态方法,单例统一返回入口,返回对象的唯一实例
    {
        if (!(self:instance instanceof self))   
        {
            self:instance=new self($dbHost,$dbName,$dbUser,$dbPwd,$charset);   
        }
        return self:instance;
    }
        
}
$db1=MyDBClass::get_instance('localhost','bbs','root','iaechina','utf8')->db->query("select * from t_user")->fetch_assoc();


print_r($db1);
echo "<br>";

$db2=MyDBClass::get_instance('localhost','bbs','12345','123123124','utf8')->db->query("select * from t_user")->fetch_assoc();

print_r($db2);
?>

$db2中的参数很明显是我乱填的。。但因为$instance已经被实例化,所以调用这方法的时候直接返回了$db1时实例化后的$instance。
有些朋友或许会说,我也可以不这样做啊,我直接利用global关键字不就可以了吗?的确,global可以解决问题,也起到了单例模式的作用,但是OOP中,我们拒绝这样来编写代码,因为global存在安全隐患,请参考相关书籍,同时单例模式恰恰是对全局变量的一种改进,避免了那些存储唯一实例的全局变量污染命名空间。

看完了  明白些了  但还不完全了解  继续学习中。。。。。。。

本版积分规则