首页 > 开发 > PHP > 正文

PHP单例模式实例浅析

2024-05-04 22:00:11
字体:大 中 小
来源:转载
供稿:网友

全局变量是面向对象程序员遇到的引发bug的主要原因之一,这是因为全局变量将类捆绑于特定的环境,破坏了封装,如果新的应用程序无法保证一开始就定义了相同的环境变量,那么一个依赖于全局变量的类就无法从一个应用程序中提取出来并应用到新的应用程序中.

什么是单例模式呢

单例模式顾名思义,就是只有一个实例,作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类我们称之为单例类。

单例模式的要点有三个:

它们必须拥有一个构造函数,并且必须被标记为private,它们拥有一个保存类的实例的静态成员变量,它们拥有一个访问这个实例的公共的静态方法,和普通类不同的是,单例类不能在其他类中直接实例化,单例类只能被其自身实例化,要获得这样的一种结果,__construct()方法必须被标记为private,如果试图用private构造函数构造一个类,就会得到一个可访问性级别的错误.

要让单例类起作用,就必须使其为其他类提供一个实例,用它调用各种方法,单例类不会创建实例副本,而是会向单例类内部存储的实例返回一个引用,结果是单例类不会重复占用内存和系统资源,从而让应用程序的其它部分更好地使用这些资源,作为这一模式的一部分,必须创建一个空的私有__clone()方法,以防止对象被复制或克隆.

返回实例引用的这个方法通常被命名为getInstance(),这个方法必须是静态的,而且如果它还没有实例化,就必须进行实例化,getInstance() 方法通过使用 instanceof 操作符和self 关键字,可以检测到类是否已经被实例化,代码如下:

  1. header("Content-type:text/html;charset=utf-8"); 
  2. //单例测试类 
  3. class Test { 
  4.     private $unique; 
  5.     static private $instance;//静态属性保存该类实例 
  6.        
  7.     private function __construct(){//构造方法私有(防止外界调用) 
  8.         $this->unique=rand(0,20000); 
  9.     } 
  10.     static public function getInstance(){//静态方法提供对外接口(获取实例) 
  11.         if(!self::$instance instanceof self){ 
  12.             self::$instance=new self(); 
  13.         } 
  14.         return self::$instance; 
  15.     } 
  16.     private function __clone(){}//私有克隆方法,防止外界直接克隆该实例 
  17.       
  18. } 
  19. $test=Test::getInstance(); 
  20. $test2=Test::getInstance(); 
  21.  //开源软件:Vevb.com 
  22. print_r($test);  
  23. print_r($test2); 
  24.       
  25. if($test===$test2){ 
  26.     echo '相等!'; 
  27. }else{ 
  28.     echo '不相等!'; 
  29. } 

好了,该说书代码了,我们在程序中查询数据的操作会非常非常的多,我们不可能每次都new一个对象,这样太耗费开销了,那么我们怎么办呢,单例模式是个不错的选择,单例模式,只能实例化一次,下面看一下代码.

db.class.php,代码如下:

  1. <?php 
  2. //数据库类、单例模式 
  3. class db{ 
  4. public $conn; 
  5. private  static $sql; 
  6. private static $instact = null; 
  7. private function __construct(){ 
  8. require_once('db.config.php'); 
  9. $this->conn = mysql_connect($db['host'],$db['user'],$db['psd']); 
  10. if(!mysql_select_db($db['databases'],$this->conn)){ 
  11. echo "数据库连接错误"; 
  12. } 
  13. mysql_query('set names utf8',$this->conn); 
  14. } 
  15. public static function getInstance(){ 
  16. if(is_null(self::$instact)){ 
  17. self::$instact = new  db; 
  18. } 
  19. return self::$instact; 
  20. } 
  21. /** 
  22. *数据查询 
  23. */ 
  24. public function select($table,$condition=array(),$field=array()){ 
  25. $where =""; 
  26. if(!emptyempty($condition)){ 
  27. foreach($condition as $k=>$v){ 
  28. $where.= $k."='".$v."' and "; 
  29. } 
  30. $where = "where ".$where." 1=1"; 
  31. } 
  32. if(!emptyempty($field)){ 
  33. foreach($field as $k=>$v){ 
  34. $fieldstr.= $v.","; 
  35. } 
  36. $fieldstr = rtrim($fieldstr); 
  37. }else{ 
  38. $fieldstr = "*"; 
  39. } 
  40. self::$sql = "select {$fieldstr} from {$table} {$where}"; 
  41. $result =  mysql_query(self::$sql); 
  42. $i = 0; 
  43. while($row = mysql_fetch_assoc($result)){ 
  44. foreach($row as $k=>$v){ 
  45. $resultrow[$i][$k] = $v; 
  46. } 
  47. $i++; 
  48. } 
  49. var_dump($resultrow); 
  50. } 
  51. /** 
  52. *数据添加 
  53. */ 
  54. public function insert($table,$data){ 
  55. $values = ""; 
  56. $datas = ""; 
  57. foreach ($data as $k=>$v){ 
  58. $values.=$k.","; 
  59. $datas.="'$v'".","; 
  60. } 
  61. $values = rtrim($values,','); 
  62. $datas = rtrim($datas,','); 
  63. self::$sql = "insert into {$table}({$values}) values ({$datas})"; 
  64. if(mysql_query(self::$sql)){ 
  65. return mysql_insert_id(); 
  66. }else{ 
  67. return false; 
  68. }; 
  69. } 
  70. /** 
  71. *数据更新 
  72. */ 
  73. public function update($table,$data,$condition=array()){ 
  74. $where = ""; 
  75. if(!emptyempty($condition)){ 
  76. foreach ($condition as $k=>$v){ 
  77. $where.= $k."=".$v." and "; 
  78. } 
  79. $where="where ".$where."1=1"; 
  80. } 
  81. $updatastr = ""; 
  82. if(!emptyempty($data)){ 
  83. foreach($data as $k=>$v){ 
  84. $updatastr.= $k."='".$v."',"; 
  85. } 
  86. $updatastr= "set ".rtrim($updatastr,","); 
  87. } 
  88. self::$sql = "update {$table} {$updatastr} {$where}"; 
  89. return mysql_query(self::$sql); 
  90. } 
  91. /** 
  92. *数据 删除 
  93. */ 
  94. public function delete($table,$condition){ 
  95. $where = ""; 
  96. if(!emptyempty($condition)){ 
  97. foreach( $condition as $k=>$v){ 
  98. $where.=$k."='".$v."' and "; 
  99. } 
  100. $where = "where ".$where.'1=1'; 
  101. } 
  102. self::$sql = "delete from {$table}  {$where}"; 
  103. return mysql_query(self::$sql); 
  104. }  //开源软件:Vevb.com 
  105. //打印sql 
  106. public function getlastsql(){ 
  107. echo self::$sql; 
  108. } 
  109. } 
  110. $ne = db::getInstance(); 
  111. //$ne->update('message',array('user'=>'wanghao','title'=>'sd'),array('id'=>'5')); 
  112. //echo $db->insert('message',array('user'=>'张三','title'=>'demo')); 
  113. $ne->select('message',array('user'=>'songlin')); 
  114. $ne->getlastsql(); 
  115. ?> 

数据库的配置文件,db.config.php:

  1. <?php 
  2. $host = "localhost";  //主机地址 
  3. $user = "root";         //用户名 
  4. $psd= "";                 //密码 
  5. $databases = "ceshi"; 
  6. $db = array( "host" =>$host, 
  7. "user" =>$user, 
  8. "psd" =>$psd, 
  9. "databases"=>$databases 
  10. ); 
  11. ?>

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表