Singleton,有人翻译叫:“单例、单件”啥啥的。有关php的singleton,baidu不到多少有用的介绍,都是你抄我我抄你的。没啥意思。更详细的参考,应该直接看官方文档:php singleton 。
Singleton的主要设计思想就是:将对象的构造声明成一个私有方法,再把他本身丢到一个静态变量里面。通过判断静态变量的有无,来自己实例化自己。
一个简单的例子:
class Example{
private static $instance;
private function __construct(){ }
public function callObj(){
if(!self::$instance){
self::$instance = new Example();
}
return self::$instance;
}
function doSomething(){ …….. }
}
然后会这样调用:
$obj = Example::callObj();
$obj->doSomething();
ok,到现在为止,都很容易。
那么我遇到了什么?
最初我的function __construct()是空的,我实例化了对象之后,企图直接在callObj()中通过$this->doSomething();。按照我之前的理解,既然我上面已经实例化了该对象,之后应该就直接可以用了。结果非常囧,无论如何也不能调用$this,只能使用self,这样就有些个不方便了。
怎么回事情?
继续看了一下文档然后自己尝试了一下,原来是这样来解析的:
$obj = Example::callObj()已经实例化对象并返回,之后调用的$obj->doSomething()中,使用$this是不会有任何问题。和范例一样
在没有返回实例化的对象之前,在callObj()中只能使用self来调用方法,不能直接使用$this->doSomething(),这种情况下,方法doSomething中都不能使用$this
但是:如果是通过构造函数:__construct()来调用的,那么在__construct中可以使用$this关键字没有任何问题。
没了,就是这样一个小问题,这里记录一下