work record II:有关Singleton

星期一 09月 8thphp, 工作研究 Category

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,这样就有些个不方便了。

怎么回事情?

继续看了一下文档然后自己尝试了一下,原来是这样来解析的:

  1. $obj = Example::callObj()已经实例化对象并返回,之后调用的$obj->doSomething()中,使用$this是不会有任何问题。和范例一样
  2. 在没有返回实例化的对象之前,在callObj()中只能使用self来调用方法,不能直接使用$this->doSomething(),这种情况下,方法doSomething中都不能使用$this
  3. 但是:如果是通过构造函数:__construct()来调用的,那么在__construct中可以使用$this关键字没有任何问题。

没了,就是这样一个小问题,这里记录一下

No Comments Yet

You can be the first to comment!

Leave a comment

Size

Colors