php 面向对象单例模式,PHP设计模式-单例模式

本文详细介绍了PHP单例模式的概念及其实现方式,包括构造函数私有化、静态成员变量和公共静态方法的使用等。此外,还展示了如何通过一个具体的数据库操作类db来实例化单例模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单例模式(职责模式):

简单的说,一个对象(在学习设计模式之前,需要比较了解面向对象思想)只负责一个特定的任务;

单例类:

1、构造函数需要标记为private(访问控制:防止外部代码使用new操作符创建对象),单例类不能在其他类中实例化,只能被其自身实例化;

2、拥有一个保存类的实例的静态成员变量

3、拥有一个访问这个实例的公共的静态方法(常用getInstance()方法进行实例化单例类,通过instanceof操作符可以检测到类是否已经被实例化)

另外,需要创建__clone()方法防止对象被复制(克隆)

为什么要使用PHP单例模式?

1、php的应用主要在于数据库应用,所以一个应用中会存在大量的数据库操作,使用单例模式,则可以避免大量的new操作消耗的资源。

2、如果系统中需要有一个类来全局控制某些配置信息,那么使用单例模式可以很方便的实现.这个可以参看ZF的FrontController部分。

3、在一次页面请求中,便于进行调试,因为所有的代码(例如数据库操作类db)都集中在一个类中,我们可以在类中设置钩子,输出日志,从而避免到处var_dump, echo。

1、含义

作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局地提供这个实例。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。

2、单例模式的三个要点:

(1). 需要一个保存类的唯一实例的静态成员变量:

private static $_instance;

(2). 构造函数和克隆函数必须声明为私有的,防止外部程序new类从而失去单例模式的意义:

private function __construct()

{

$this->_db = pg_connect('xxxx');

}

private function __clone()

{

//覆盖__clone()方法,禁止克隆

}

(3).必须提供一个访问这个实例的公共的静态方法(通常为getInstance方法),从而返回唯一实例的一个引用

public static function getInstance()

{

if(! (self::$_instance instanceof self) )

{

self::$_instance = new self();

}

return self::$_instance;

}

调用 $danli = Danli::getInstance();

$danli->方法名();

深入解析单例模式的使用:db类

class db{

public $mysql_server_name="localhost";

public $mysql_username="root";

public $mysql_password="";

public $mysql_database="test";

public $conn;

public static $sql;

public static $instance=null;

public function __construct(){

$conn=mysql_connect($this->mysql_server_name,$this->mysql_username,$this->mysql_password) or die("error connecting");

mysql_query("set names 'utf8'");

$his->conn=mysql_select_db($this->mysql_database); //打开数据库

return $this->conn=$conn;

}

public static function getInstance(){

if(is_null(self::$instance)){

self::$instance = new db;

}

return self::$instance;

}

private function __clone()

{

//防止被克隆;

}

/**

* 查询数据库

*/

public function select($table,$condition=array(),$field = array()){

$where='';

if(!empty($condition)){

foreach($condition as $k=>$v){

$where.=$k."='".$v."' and ";

}

$where='where '.$where .'1=1';

}

$fieldstr = '';

if(!empty($field)){

foreach($field as $k=>$v){

$fieldstr.= $v.',';

}

$fieldstr = rtrim($fieldstr,',');

}else{

$fieldstr = '*';

}

self::$sql = "select {$fieldstr} from {$table} {$where}";

$result=mysql_query(self::$sql,$this->conn);

$resuleRow = array();

$i = 0;

while($row=mysql_fetch_assoc($result)){

foreach($row as $k=>$v){

$resuleRow[$i][$k] = $v;

}

$i++;

}

return $resuleRow;

}

/**

* 添加一条记录

*/

public function insert($table,$data){

$values = '';

$datas = '';

foreach($data as $k=>$v){

$values.=$k.',';

$datas.="'$v'".',';

}

$values = rtrim($values,',');

$datas   = rtrim($datas,',');

self::$sql = "INSERT INTO  {$table} ({$values}) VALUES ({$datas})";

if(mysql_query(self::$sql)){

return mysql_insert_id();

}else{

return false;

};

}

/**

* 修改一条记录

*/

public function update($table,$data,$condition=array()){

$where='';

if(!empty($condition)){

foreach($condition as $k=>$v){

$where.=$k."='".$v."' and ";

}

$where='where '.$where .'1=1';

}

$updatastr = '';

if(!empty($data)){

foreach($data as $k=>$v){

$updatastr.= $k."='".$v."',";

}

$updatastr = 'set '.rtrim($updatastr,',');

}

self::$sql = "update {$table} {$updatastr} {$where}";

return mysql_query(self::$sql);

}

/**

* 删除记录

*/

public function delete($table,$condition){

$where='';

if(!empty($condition)){

foreach($condition as $k=>$v){

$where.=$k."='".$v."' and ";

}

$where='where '.$where .'1=1';

}

self::$sql = "delete from {$table} {$where}";

return mysql_query(self::$sql);

}

public static function getLastSql(){

echo self::$sql;

}

}

$abc=db::getInstance();

//var_dump($abc->select('text')); //-查询-

//$abc->insert('text',array('name'=>'haha')); //-增加-

//$abc->update('text',array('name'=>'hehe'),array('id'=>'4')); //-更新-

$abc->delete('text',array('id'=>'4')); //-删除-

$abc->getLastSql();

?>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值