php单例模式的简单实现方法_php实例

php单例模式的简单实现方法

<?php 

/**
* 设计模式之单例模式
* $_instance必须声明为静态的私有变量
* 构造函数和析构函数必须声明为私有,防止外部程序new
* 类从而失去单例模式的意义
* getInstance()方法必须设置为公有的,必须调用此方法
* 以返回实例的一个引用
* ::操作符只能访问静态变量和静态函数
* new对象都会消耗内存
* 使用场景:最常用的地方是数据库连接。
* 使用单例模式生成一个对象后,
* 该对象可以被其它众多对象所使用。
*/
class Example
{
//保存例实例在此属性中
private static $_instance; 

//构造函数声明为private,防止直接创建对象
private function __construct()
{
echo 'I am Construceted';
} 

//单例方法
public static function singleton()
{
if(!isset(self::$_instance))
{
$c=__CLASS__;
self::$_instance=new $c;
}
return self::$_instance;
} 

//阻止用户复制对象实例
public function __clone()
{
trigger_error('Clone is not allow' ,E_USER_ERROR);
} 

function test()
{
echo("test"); 

}
} 

// 这个写法会出错,因为构造方法被声明为private
$test = new Example; 

// 下面将得到Example类的单例对象
$test = Example::singleton();
$test->test(); 

// 复制对象将导致一个E_USER_ERROR.
$test_clone = clone $test;
?>

首先我们要知道明确单例模式这个概念,那么什么是单例模式呢?

单例模式顾名思义,就是只有一个实例。

作为对象的创建模式, 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,

这个类我们称之为单例类。

单例模式的要点有三个:

一是某个类只能有一个实例;

二是它必须自行创建这个实例;

三是它必须自行向整个系统提供这个实例。

下面我们讨论下为什么要使用PHP单例模式?

多数 人都是从单例模式的字面上的意思来理解它的用途, 认为这是对系统资源的节省, 可以避免重复实例化, 是一种"计划生育". 而PHP每次执行完页面都是会从内存中清理掉所有的资源. 因而PHP中的单例实际每次运行都是需要重新实例化的, 这样就失去了单例重复实例化的意义了. 单单从这个方面来说, PHP的单例的确有点让各位失望. 但是单例仅仅只有这个功能和应用吗? 答案是否定的,我们一起来看看。

1. php的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 在使用面向对象的方式开发时(废话), 如果使用单例模式, 则可以避免大量的new 操作消耗的资源。

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

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

以上这篇php单例模式的简单实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索php实现单例模式
java单例模式实例、单例模式实例、as3单例模式实例、js 单例模式实例、单例模式的应用实例,以便于您获取更多的相关知识。

时间: 2024-12-29 17:01:15

php单例模式的简单实现方法_php实例的相关文章

PHP中__autoload和Smarty冲突的简单解决方法_php实例

本文讲述了PHP中__autoload和Smarty冲突的简单解决方法.分享给大家供大家参考,具体如下: 一.问题: 最近,在项目中发现,PHP 的 __autoload 方法失效了.调试了好久,百思不得其解,查了下资料才知道原来是 Smarty 的原因.新版的 Smarty 改变了autoload的方式. 二.解决方法: 在 Smarty 的包含类文件后加一段代码,spl_autoload_register("__autoload"); 如下: <?php define('RO

PHP用FTP类上传文件视频等的简单实现方法_php实例

文件1:ftp.php <?php /** * 仿写CodeIgniter的FTP类 * FTP基本操作: * 1) 登陆; connect * 2) 当前目录文件列表; filelist * 3) 目录改变; chgdir * 4) 重命名/移动; rename * 5) 创建文件夹; mkdir * 6) 删除; delete_dir/delete_file * 7) 上传; upload * 8) 下载 download * * @author quanshuidingdang */ cl

PHP Smarty模版简单使用方法_php实例

本文实例讲述了PHP Smarty模版简单使用方法.分享给大家供大家参考,具体如下: Index.php: require('../libs/Smarty.class.php'); $smarty = new Smarty; // 添加自定义调节器 $smarty->registerPlugin("modifier", "e", "htmlspecialchars"); $smarty->registerPlugin("mo

thinkPHP3.1验证码的简单实现方法_php实例

本文实例讲述了thinkPHP3.1验证码的简单实现方法.分享给大家供大家参考,具体如下: 代码中写: public function verify(){ import('ORG.Util.Image'); ob_clean(); Image::buildImageVerify(); } html中写: <img src='__APP__/Index/verify/' onClick="this.src=this.src+'?'+Math.random()" /> 就是说图

thinkPHP中验证码的简单使用方法_php实例

本文实例讲述了thinkPHP中验证码的简单使用方法.分享给大家供大家参考,具体如下: 首先生成验证码,在action文件中,直接调用thinkphp中提供的方法即可生成,确保开启php的扩展 gd2 如下: class UserAction Model extends Model { /** * 显示验证码信息 */ public function verify() { ob_clean(); // 清空(擦掉)输出缓冲区 ,也就是清空前面的输出,通常情况下验证码不显示,可考虑这个问题 imp

thinkPHP中验证码的简单实现方法_php实例

本文实例讲述了thinkPHP中验证码的简单实现方法.分享给大家供大家参考,具体如下: 运行效果图如下: 1.php端生成验证码函数 public function verify(){ // 验证码 import("@.Util.Image"); Image::buildImageVerify(4,1,'png',40,20,'verify'); } /** * 生成图像验证码 * @static * @access public * @param string $length 位数

thinkPHP删除前弹出确认框的简单实现方法_php实例

本文实例讲述了thinkPHP删除前弹出确认框的简单实现方法.分享给大家供大家参考,具体如下: html部分: 复制代码 代码如下: <a href="__URL__/shanchu/id/{$vo.id}" onclick='return del();'>删除</a> javascript部分: <script> function del() { if(confirm("确定要删除吗?")) { return true; } e

thinkphp3.x自定义Action、Model及View的简单实现方法_php实例

本文实例讲述了thinkphp3.x自定义Action.Model及View的实现方法.分享给大家供大家参考,具体如下: 1.在xmall/Lib/Action中创建文件TestAction.class.php class TestAction extends Action{ function index(){ $this->display("test"); } } 2.在xmall/tpl下创建default文件夹,在default下创建Test文件夹,在Test下创建test

PHP使用PHPMailer发送邮件的简单使用方法_php实例

最近需要用到发送邮件的功能,原本是用PHP自带的mail()函数发送的.php mail()这个方法非常简单.方便.易用,但是除了网易邮箱.QQ邮箱.GMAIL邮箱等常用的邮箱可以收到之外,经测试HOTMAIL.TOM.LIVE等邮箱是收不到此类邮件的.所以就转而使用PHPMailer这个强大的邮件发送类.使用官方自带的一些例子,有些会报 Mailer Error: Could not instantiate mail function. 这个错误.参考了一些资料之后,还是自己写了一个方法.代码