PHP实现单例模式
<?php
/**
* 【单例模式】
* 总结:防止外部new对象;防止子类继承;防止克隆。
*/
header("Content-type: text/html; charset=utf-8");
/******* NO.1 普通的可以调用的类 ******/
//先定义一个类,实例化两次,看看是否全等(===)
class sigleA{
}
$sa1 = new sigleA();
$sa2 = new sigleA();
//注意:当两个对象是一个的时候,才会全等
//此处输出 “sa-不是一个对象”
if($sa1 === $sa2){
echo 'sa-是一个对象<br>';
}else{
echo 'sa-不是一个对象<br>';
}
/********************* NO.2 封锁new操作 ********************/
//getIns 预先判断实例
class sigleB{
protected static $ins = null;
public static function getIns(){ //getIns 获取实例
if(self::$ins === null){
//把【自身对象】 赋给 一个自己的 【静态属性】
self::$ins = new self();
}
return self::$ins;
}
//保护的 构造函数
protected function __construct(){
}
}
//再去判断两个对象
$sb1 = sigleB::getIns();
$sb2 = sigleB::getIns();
//此处输出 “sb-是一个对象”
if($sb1 === $sb2){
echo 'sb-是一个对象<br>';
}else{
echo 'sb-不是一个对象<br>';
}
////----- 但是,下面用一个新的类继承自上面的 sigleB ...
class multi extends sigleB{
public function __construct(){
}
}
$m1 = new multi();
$m2 = new multi();
//此处输出 “m-不是一个对象”,原因在于被继承后,__construct 被公开了
if($m1 === $m2){
echo 'm-是一个对象<br>';
}else{
echo 'm-不是一个对象<br>';
}
/********************* NO.3 final防止继承 ********************/
class sigleC{
protected static $ins = null;
public static function getIns(){
if(self::$ins === null){
self::$ins = new self();
}
return self::$ins;
}
//若方法前加上final,则方法不能被覆盖;
//若类前加上final,则类不能被继承
final protected function __construct(){
}
//同样的,防止克隆(clone)
final protected function __clone(){
}
}
$sc1 = sigleC::getIns();
$sc2 = clone $sc1;
//被克隆了,又产生了多个对象;
//如果没加上 防止克隆的代码,此处输出 “sc-不是一个对象”
//上面加上了 final protected function __clone(),这里就会出错:
//Fatal error: Call to protected sigleC::__clone() from context '' in ...
if($sc1 === $sc2){
echo 'sc-是一个对象<br>';
}else{
echo 'sc-不是一个对象<br>';
}
PHP实现单例模式的更多相关文章
- C++实现线程安全的单例模式
在某些应用环境下面,一个类只允许有一个实例,这就是著名的单例模式.单例模式分为懒汉模式,跟饿汉模式两种. 首先给出饿汉模式的实现 template <class T> class sing ...
- 23种设计模式--单例模式-Singleton
一.单例模式的介绍 单例模式简单说就是掌握系统的至高点,在程序中只实例化一次,这样就是单例模式,在系统比如说你是该系统的登录的第多少人,还有数据库的连接池等地方会使用,单例模式是最简单,最常用的模式之 ...
- angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用
今天我们要讲的是ng2的路由系统. 例子
- java设计模式之--单例模式
前言:最近看完<java多线程编程核心技术>一书后,对第六章的单例模式和多线程这章颇有兴趣,我知道我看完书还是记不住多少的,写篇博客记录自己所学的只是还是很有必要的,学习贵在坚持. 单例模 ...
- 设计模式C#合集--单例模式
单例模式 代码: 第一种: private static Singleton singleton = null; private Singleton() { } public static Singl ...
- 设计模式之单例模式(Singleton)
设计模式之单例模式(Singleton) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...
- GOF23设计模式之单例模式
·核心作用: -保证一个类只有一个实例,并且提供一个访问该实例的全局访问点. ·常见应用场景: -Windows的Task Manager(任务管理器)就是很典型的单例模式 -Windows的Recy ...
- GJM : C#设计模式(1)——单例模式
感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...
- PHP设计模式(四)单例模式(Singleton For PHP)
今天讲单例设计模式,这种设计模式和工厂模式一样,用的非常非常多,同时单例模式比较容易的一种设计模式. 一.什么是单例设计模式 单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对 ...
- java设计模式之单例模式(几种写法及比较)
概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...
随机推荐
- Spring boot中使用springfox来生成Swagger Specification小结
Rest接口对应Swagger Specification路径获取办法: 根据location的值获取api json描述文件 也许有同学会问,为什么搞的这么麻烦,api json描述文件不就是h ...
- Autorelease pool
根据苹果官方文档中对 Using Autorelease Pool Blocks 的描述,我们知道在下面三种情况下是需要我们手动添加 autoreleasepool 的: 如果你编写的程序不是基于 U ...
- 清除UIWebView的缓存
//清除cookies NSHTTPCookie *cookie; NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCook ...
- django url 软编码
期初用django 开发应用的时候,完全是在urls.py 中硬编码配置地址,在views.py中HttpResponseRedirect()也是硬编码转向地址,当然在template 中也是一样了, ...
- pip是用国内镜像源
pipy国内镜像目前有: http://pypi.douban.com/ 豆瓣 http://pypi.hustunique.com/ 华中理工大学 http://pypi.sdutlinux.o ...
- Java基础之创建窗口——创建应用程序窗口(TryWindow)
控制台程序. 准备好应用程序窗口及其包含的组件并显示,这称为实现窗口.调用应用程序窗口对象的setVisible()方法就会实现窗口.实现了应用程序的GUI之后,在主线程中修改或查询GUI可能会导致死 ...
- 脚本:SQLServer 2008 生成某数据库中的所有索引创建脚本
--1. get all indexes from current db, place in temp table select schemaName = s.name, tablename = ob ...
- PostgreSQL Replication之第十一章 使用Skytools(1)
向您介绍了 Slony 之后,我们将介绍另外一种流行的复制工作.Skytools 是一个最初有 Skype 开发的软件包,它有多种用途.Skytools 不只是一个单一的程序,而且是一个工具与服务的集 ...
- PHP 小谈静态用法
1.静态的表现形式,在PHP中定义一个静态变量需要加入一个关键字——static,静态对象是属于类的,非静态对象是属于对象的 class Fenbi { public $changdu;//属于对象的 ...
- configuring tortoise git and vs code.
Preparation, SSH keygen: $ git config --global user.name "calos" $ git config --global use ...