新的self()是什么?在PHP中意味着什么?
我从未见过这样的代码:
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
-即在这里也一样, 。
在PHP <5.3中,“编写它的类”很重要-有时会引起问题。
这就是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 Late
Bindings页面。
以上是 新的self()是什么?在PHP中意味着什么? 的全部内容, 来源链接: utcz.com/qa/423762.html