什么是新的自我();在 PHP 中的意思是?

2022-08-30 07:09:14

我从未见过这样的代码:

public static function getInstance()
{
    if ( ! isset(self::$_instance)) {
        self::$_instance = new self();
    }
    return self::$_instance;
}

它与 相同吗?new className()

编辑

如果该类是继承的,它指向哪个类?


答案 1

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) { } 

这意味着 - 即编写它的类。selfMyChildClass


对于第二种情况,代码将如下所示:
class MyParentClass {
    public static function getInstance() {
        return new self();
    }
}
class MyChildClass extends MyParentClass {
    
}

$a = MyChildClass::getInstance();
var_dump($a);

你会得到这样的输出:

object(MyParentClass)#1 (0) { }

这意味着 - 即这里也是,编写它的类selfMyParentClass




使用PHP这就是为什么PHP 5.3引入了关键字的新用法:它现在可以准确地在我们在这些示例中使用的位置使用:staticself
class MyParentClass {
    public static function getInstance() {
        return new static();
    }
}
class MyChildClass extends MyParentClass {
    
}

$a = MyChildClass::getInstance();
var_dump($a);

但是,用 代替 ,您现在将获得:staticself

object(MyChildClass)#1 (0) { } 

这意味着它指向所使用的类(我们使用的),而不是编写它的类。staticMyChildClass::getInstance()

当然,行为并没有改变,为了不破坏现有的应用——PHP 5.3只是增加了一个新的行为,回收了关键字。selfstatic


而且,说到 PHP 5.3,你可能想看看 PHP 手册的 [Late Static Bindings][1] 页面。

答案 2

这似乎是单例模式的实现。该函数以静态方式调用,并检查静态类是否设置了变量。$_instance

如果不是,它将初始化自身的实例 () 并将其存储在 .new self()$_instance

如果调用,您将在每次调用时获得一个相同的类实例,这是单例模式的要点。className::getInstance()

不过,我从未见过它以这种方式完成,老实说,我不知道这是可能的。在类中声明了什么?$_instance


推荐