什么是新的自我();在 PHP 中的意思是?
我从未见过这样的代码:
public static function getInstance()
{
if ( ! isset(self::$_instance)) {
self::$_instance = new self();
}
return self::$_instance;
}
它与 相同吗?new className()
编辑
如果该类是继承的,它指向哪个类?
我从未见过这样的代码:
public static function getInstance()
{
if ( ! isset(self::$_instance)) {
self::$_instance = new self();
}
return self::$_instance;
}
它与 相同吗?new className()
编辑
如果该类是继承的,它指向哪个类?
self
指向编写它的类。
因此,如果您的getInstance方法位于类名中,则以下行:MyClass
self::$_instance = new self();
将执行与以下操作相同的操作:
self::$_instance = new MyClass();
编辑 :在评论之后,提供更多信息。
如果您有两个相互扩展的类,则有两种情况:
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
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()
当然,行为并没有改变,为了不破坏现有的应用——PHP 5.3只是增加了一个新的行为,回收了关键字。self
static
这似乎是单例模式的实现。该函数以静态方式调用,并检查静态类是否设置了变量。$_instance
如果不是,它将初始化自身的实例 () 并将其存储在 .new self()
$_instance
如果调用,您将在每次调用时获得一个相同的类实例,这是单例模式的要点。className::getInstance()
不过,我从未见过它以这种方式完成,老实说,我不知道这是可能的。在类中声明了什么?$_instance