0

0

PHP单例模式实例浅析

php中文网

php中文网

发布时间:2016-05-26 08:20:00

|

1568人浏览过

|

来源于php中文网

原创

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

什么是单例模式呢

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

单例模式的要点有三个:

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

立即学习PHP免费学习笔记(深入)”;

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

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

威客
威客

PHP威客系统威客贰系统是国内领先的威客网站内容管理系统,基于PHP+Mysql架构开发。整合UCHOME系统,系统内容模块由:威客悬赏,招标任务,人才库,人才,招聘,新闻资讯,在线支付,发贴推广,案例示范等多种功能组成。 威客贰系统独创的单人悬赏、 多人悬赏 、计件悬赏 、 定金招标、 本地招标为核心任务模式。超强的发贴推广可以分配到不同的任务模式不同的会员等级有不同的提成费用,根据网站自身需要

下载
header("Content-type:text/html;charset=utf-8"); 
	//单例测试类 
	class Test { 
	    private $unique; 
	    static private $instance;//静态属性保存该类实例 
	       
	    private function __construct(){//构造方法私有(防止外界调用) 
	        $this->unique=rand(0,20000); 
	    } 
	    static public function getInstance(){//静态方法提供对外接口(获取实例) 
	        if(!self::$instance instanceof self){ 
	            self::$instance=new self(); 
	        } 
	        return self::$instance; 
	    } 
	    private function __clone(){}//私有克隆方法,防止外界直接克隆该实例 
	      
	} 
	$test=Test::getInstance(); 
	$test2=Test::getInstance(); 
	  
	print_r($test);  
	print_r($test2); 
	      
	if($test===$test2){ 
	    echo '相等!'; 
	}else{ 
	    echo '不相等!'; 
	}

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

db.class.php,代码如下:

<?php
//数据库类、单例模式
class db {
    public $conn;
    private static $sql;
    private static $instact = null;
    private function __construct() {
        require_once ('db.config.php');
        $this->conn = mysql_connect($db['host'], $db['user'], $db['psd']);
        if (!mysql_select_db($db['databases'], $this->conn)) {
            echo "数据库连接错误";
        }
        mysql_query('set names utf8', $this->conn);
    }
    public static function getInstance() {
        if (is_null(self::$instact)) {
            self::$instact = new db;
        }
        return self::$instact;
    }
    /** 
     *数据查询
     */
    public function select($table, $condition = array() , $field = array()) {
        $where = "";
        if (!emptyempty($condition)) {
            foreach ($condition as $k => $v) {
                $where.= $k . "='" . $v . "' and ";
            }
            $where = "where " . $where . " 1=1";
        }
        if (!emptyempty($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);
        $i = 0;
        while ($row = mysql_fetch_assoc($result)) {
            foreach ($row as $k => $v) {
                $resultrow[$i][$k] = $v;
            }
            $i++;
        }
        var_dump($resultrow);
    }
    /** 
     *数据添加
     */
    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 (!emptyempty($condition)) {
            foreach ($condition as $k => $v) {
                $where.= $k . "=" . $v . " and ";
            }
            $where = "where " . $where . "1=1";
        }
        $updatastr = "";
        if (!emptyempty($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 (!emptyempty($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);
    }
    //打印sql
    public function getlastsql() {
        echo self::$sql;
    }
}
$ne = db::getInstance();
//$ne->update('message',array('user'=>'wanghao','title'=>'sd'),array('id'=>'5'));
//echo $db->insert('message',array('user'=>'张三','title'=>'demo'));
$ne->select('message', array(
    'user' => 'songlin'
));
$ne->getlastsql();

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

<?php 
	$host = "localhost";  //主机地址 
	$user = "root";         //用户名 
	$psd= "";                 //密码 
	$databases = "ceshi"; 
	$db = array( "host" =>$host, 
	"user" =>$user, 
	"psd" =>$psd, 
	"databases"=>$databases 
	); 	


本文地址:

转载随意,但请附上文章地址:-)

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

463

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

135

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

64

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

20

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

26

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

29

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

14

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

524

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

53

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.4万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号