self 指向编写它的类。
因此,如果您的 getInstance 方法位于类名 MyClass 中,则以下行:
self::$_instance = new self();
会做同样的事情:
self::$_instance = new MyClass();
编辑:在 cmets 之后提供更多信息。
如果你有两个相互扩展的类,你有两种情况:
-
getInstance 在子类中定义
-
getInstance在父类中定义
第一种情况看起来像这样(对于这个例子,我已经删除了所有不必要的代码——你必须将它添加回来才能获得单例行为)*:
class MyParentClass {
}
class MyChildClass extends MyParentClass {
public static function getInstance() {
return new self();
}
}
$a = MyChildClass::getInstance();
var_dump($a);
在这里,你会得到:
object(MyChildClass)#1 (0) { }
这意味着self 意味着MyChildClass——即编写它的类。
对于第二种情况,代码如下所示:
class MyParentClass {
public static function getInstance() {
return new self();
}
}
class MyChildClass extends MyParentClass {
}
$a = MyChildClass::getInstance();
var_dump($a);
你会得到这样的输出:
object(MyParentClass)#1 (0) { }
这意味着self 意味着MyParentClass——也就是这里,编写它的类。
使用 PHP 这就是为什么 PHP 5.3 引入了
static 关键字的新用法:它现在可以准确地用于我们在这些示例中使用
self 的地方:
class MyParentClass {
public static function getInstance() {
return new static();
}
}
class MyChildClass extends MyParentClass {
}
$a = MyChildClass::getInstance();
var_dump($a);
但是,使用static 而不是self,您现在将获得:
object(MyChildClass)#1 (0) { }
这意味着static 有点指向使用的类(我们使用了MyChildClass::getInstance()),而不是编写它的类。
当然,self 的行为没有改变,为了不破坏现有的应用程序——PHP 5.3 只是添加了一个新的行为,回收了 static 关键字。
而且,谈到 PHP 5.3,您可能需要查看 PHP 手册的 [Late Static Bindings][1] 页面。