单例模式也就是一个类只能创建出一个对象
首先你要知道它的基本思想为:三私一公
何为三私一公?
 
1(私)、防止用户通过构造方法创建对象,因此私有化构造方法。
2(公)、创建一个公共静态函数用来进入类内部;思考:为什么要是静态的?为什么要公开?答:因为目前没有任何对象,只能由类来调用;因为需要类外调用
3(私)、增加一个静态私有属性:该静态属性用于保存已经实例化好了的对象,判断是否存在这个对象,如果存在,后续调用的时候直接返回它就行了!思考:为什么要是静态的?为什么要私有?答:因为还没有对象,只能用类去访问;因为要保证类外不能操作该属性。
4(私)、将克隆方法私有化,防止用户通过克隆来创建新的对象。
以下通过一个数据库连接的例子来讲解:
<?php
class MySQLDB{
//定义数据可连接和要用到的属性
private $host;//主机地址
private $port;//端口号
private $user;//用户名
private $pass;//密码
private $charset;//默认字符集
private $dbname;//默认数据库
private $link;//保存连接资源
private static $instance;//定义一个私有化静态变量用来判断是否为新对象
//私有化构造函数
private function __construct($config){
$this->init($config);//调用初始化属性的值函数
$this->my_connect();//调用连接数据库函数
$this->my_charset();//调用设置字符集函数
$this->my_dbname();//设置数据库 }
//初始化私有属性的值
private function init($config){
$this->host=$config['host']?? "localhost";//判断用户是否传入了host这个属性,有的话就使用用户传入的否则就使用默认属性。??这个是简化版的三目运算符。
$this->port=$config['port']?? 3306;//下面这些都是和上面一样
$this->user=$config['user']?? 'root';
$this->pass=$config['pass']?? 'admain';
$this->charset=$config['charset']?? 'utf8';
$this->dbname=$config['dbname']?? 'php';
}
//获得实例化对象
public static function instance($config){
if(!self::$instance instanceof self){ //判断是否这个私有化静态变量是一个对象,不是就创建一个对象。
self::$instance=new self($config);
}
return self::$instance; //返回这个私有化静态变量 }
//定义私有化克隆防止克隆出一个新的对象
private function __clone(){ }
//连接数据库
private function my_connect(){
$link=mysqli_connect("$this->host:$this->port",$this->user,$this->pass);//连接数据库并把值赋给$link.注意这个$link和最开始定义的那个私有化属性$link不一样,只是恰好名字一样而已
if($link){ //判断是否存在这个$link.因为$link是个资源集所以可以直接判断
$this->link=$link;//存在则把这个$link资源集赋值给私有化属性$link
}else{
echo "对不起连接数据库失败";
return false;
}
}
//封装判断函数
private function my_query($sql){
$res=mysqli_query($this->link,$sql);
if(!$res){
echo "对不起语句执行失败";
return false;
}else{
return $res;
}
}
//选择字符集
private function my_charset(){
$sql="set names $this->charset";
$this->my_query($sql);
}
//选择数据库
private function my_dbname(){
$sql="use $this->dbname";
$this->my_query($sql);
}
//释放资源
private function __destruct(){
@mysqli_close($this->link);
} }
$config=array("user"=>"root","pass"=>"admain");//定义要传入的数组参数
$obj= MySQLDB::instance($config);//调用公共静态函数来创建一个对象
$obj1= MySQLDB::instance($config);//这里再次调用用来验证是否只能出创建一个对象。
var_dump($obj);
var_dump($obj1);
结果我这里就不放出来了图片有点大。你会发现var_dump()出来的这两个对象一模一样。

php通过单例模式使一个类只能创建一个对象。的更多相关文章

  1. python 单例模式,一个类只能生成唯一的一个实例,重写__new__方法详解

    单例:一个类只能生成唯一的一个实例 每个类只要被实例化了,他的私有属性 '_instance'就会被赋值,这样理解对吗 对 #方法1,实现__new__方法 #并在将一个类的实例绑定到类变量_inst ...

  2. java_实现一个类只能声明一个对象

    public class StaticDemo { public int a=10; private static StaticDemo s= new StaticDemo(); private St ...

  3. singleton 类模板限制类只能定义一个对象

    singleton 类模板限制类只能定义一个对象 singleton 类模板限制类只能定义一个对象 singleton 类模板限制类只能定义一个对象 ???

  4. C++中如何设计一个类只能在堆或者栈上创建对象,面试题

    设计一个类,该类只能在堆上创建对象 将类的构造函数私有,拷贝构造声明成私有.防止别人调用拷贝在栈上生成对象. 提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建 注意 在堆和栈上创建对象都会调 ...

  5. java单例模式(类只能创建唯一对象)

    //饿汉式 class Single { private static final Single s= new Single(); private Single(){} public static S ...

  6. 10.按要求编写Java应用程序。 (1)创建一个叫做People的类: 属性:姓名、年龄、性别、身高 行为:说话、计算加法、改名 编写能为所有属性赋值的构造方法; (2)创建主类: 创建一个对象:名叫“张三”,性别“男”,年龄18岁,身高1.80; 让该对象调用成员方法: 说出“你好!” 计算23+45的值 将名字改为“李四”

    package com.hanqi.test; public class People { private String name,sex; private int age; private doub ...

  7. 按要求编写Java应用程序。 (1)创建一个叫做People的类: 属性:姓名、年龄、性别、身高 行为:说话、计算加法、改名 编写能为所有属性赋值的构造方法; (2)创建主类: 创建一个对象:名叫“张三”,性别“男”,年龄18岁,身高1.80; 让该对象调用成员方法: 说出“你好!” 计算23+45的值 将名字改为“李四”

    package java1; public class People { public String name; public int age; public String sex; public S ...

  8. 创建一个叫做People的类: 属性:姓名、年龄、性别、身高 行为:说话、计算加法、改名 编写能为所有属性赋值的构造方法; (2)创建主类: 创建一个对象:名叫“张三”,性别“男”,年龄18岁,身高1.80; 让该对象调用成员方法: 说出“你好!” 计算23+45的值 将名字改为“李四”

    package com.chuoji; public class People { private String name; private int age; private String sex; ...

  9. (1)创建一个叫做People的类: 属性:姓名、年龄、性别、身高 行为:说话、计算加法、改名 编写能为所有属性赋值的构造方法; (2)创建主类: 创建一个对象:名叫“张三”,性别“男”,年龄18岁,身高1.80; 让该对象调用成员方法: 说出“你好!” 计算23+45的值 将名字改为“李四”

    package a; public class People { private String name,sex; private int age; private double height; pu ...

随机推荐

  1. springboot学习笔记:3.配置文件使用概要

    Spring Boot允许外化(externalize)你的配置,这样你能够在不同的环境下使用相同的代码. 你可以使用properties文件,YAML文件,环境变量和命令行参数来外化配置.使用@Va ...

  2. Visual Studio 2017 Professional 下载

    可以进行Office 2013/2016 VSTO开发 安装平台:Win 7 SP1.Win 10. 下载: VisualStudio2017_Professional.rar

  3. 阿里云系统安装部署Freeswitch

    1.安装vim apt-get install vim 2.修改镜像源 将/etc/apt/source.list的原有源注释掉,添加下面的源: deb http://mirrors.163.com/ ...

  4. Web服务器的配置与管理

    Web服务器的配置与管理(2) 虚拟主机技术 在上篇博文中,我们已经利用IIS搭建好了一台Web服务器,并可以成功访问IIS中自带的默认站点,那么我们是否可以在这台服务器中再创建另外一个Web站点?也 ...

  5. Java IO: 并发IO

    原文链接 作者: Jakob Jenkov 译者: 李璟 有时候你可能需要并发地处理输入和输出.换句话说,你可能有超过一个线程处理输入和产生输出.比如,你有一个程序需要处理磁盘上的大量文件,这个任务可 ...

  6. Java完成生产者消费者模型

    生产者和消费者模型,是多线程中的典型模型,这里使用Java完成该模型 ServerTest.java 生产者代码 package com.orange.threadmodel; import java ...

  7. django中间件和auth模块

    Django中间件 由django的生命周期图我们可以看出,django的中间件就类似于django的保安,请求一个相应时要先通过中间件才能到达django后端(url.views.template. ...

  8. 支持向量机 SVM - Wenjing

    概念 将向量映射到一个更高维的空间里,在这个空间里建立有一个最大间隔超平面.在分开数据的超平面的两边建有两个互相平行的超平面,分隔超平面使两个平行超平面的距离最大化.假定平行超平面间的距离或差距越大, ...

  9. 多方论战!市场到底看重VR哪些特质

    VR即Virtual Reality的缩写,中文译为"虚拟现实".近年来,VR的概念不断升温,三星.谷歌.微软.索尼.HTC等互联网巨头纷纷杀入VR市场,甚至催生出许多商业神话.  ...

  10. linux常用命令使用指南

    <软件自动化测试开发>出版啦 1 系统相关 useradd/userdel   添加用户/删除用户 su      切换用户命令 ls        用于查看所有文件夹的命令 列出目录内容 ...