> 백엔드 개발 > PHP 튜토리얼 > 对单例对象的一点疑惑

对单例对象的一点疑惑

WBOY
풀어 주다: 2016-06-23 14:26:48
원래의
971명이 탐색했습니다.

static function instance($type = 'op')    {        $class = 'blog';        if (!isset(self::$_instance)) {            $_tmp = new $class();            self::$_instance = $_tmp;            $tmp = null;        }        return self::$_instance;    }
로그인 후 복사

同一个页面不断通过刷新页面请求此单例对象。是否没刷新一次就重新创建一个单例实例?
能否根据传入TYPE不同,而创建不同的实力。 那么  isset(self::$_instance)这里该怎么写


回复讨论(解决方案)

单例只是在当前程序中的单例
刷新页面就是启动了新程序

那么对于刷新页面传进来的TYPE   则肯定在self::$_instance中无法找到?
开2个网页访问该页面,则创建了2个单例对象,这样对于单例实例的意义何在呢?请解惑

在你贴出的代码中,并没有看到参数 $type 被使用
所以无法讨论这个参数相关的话题

单例在整个程序运行过程中,值保持一个实例(无论实例化多少次)
单例一般用于在对象间传递数据,从而使算法与数据分离

页面一刷新,代码就从头运行一遍。

服务器接到一个连接请求,就产生一个线程,这个线程调用php(或其他语言),向客户端传输,断开连接,结束线程
刷新是一次连接请求过程,自然就是一个新线程
由于
1.php无线程间通信,各连接线程独立,所以即使同一个程序/脚本,都是各自运行
2.最重要一点,上述的 线程,其实都是apache(或其他服务器)的线程,根本和php没什么关系,举个例子就相当于开了N个浏览器,都看同一个网页,但任一个都不能自行获取另一个的内容一样

单例就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返回,这就确保了一个类只有一个实例对象。

一般可以让类成员全部为静态来代替吧。

 PHP语言是一种解释型的脚本语言,这种运行机制使得每个PHP页面被解释执行后,所有的相关资源都会被回收。也就是说,PHP在语言级别上没有办法让某个对象常驻内存,这和asp.net、Java等编译型是不同的,比如在Java中单例会一直存在于整个应用程序的生命周期里,变量是跨页面级的,真正可以做到这个实例在应用程序生命周期中的唯一性。然而在PHP中,所有的变量无论是全局变量还是类的静态成员,都是页面级的,每次页面被执行时,都会重新建立新的对象,都会在页面执行完毕后被清空,这样似乎PHP单例模式就没有什么意义了,所以PHP单例模式我觉得只是针对单次页面级请求时出现多个应用场景并需要共享同一对象资源时是非常有意义的。

解决方案异常简单,。。写完我自己都觉得蛋疼。。直接返回两个不同的单例实例。。

单例模式我懂,也经常用。就是不太理解它给程序带来的好处到底在哪里体现。。可能我开发的项目都还比较小吧。充其量也就100WPV平均每天。

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿