当前位置: 首页 > 面试题库 >

新的self()是什么?在PHP中意味着什么?

侯博裕
2023-03-14
问题内容

我从未见过这样的代码:

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

意思selfMyChildClass-即编写它的类。

对于第二种情况,代码如下所示:

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
页面。



 类似资料:
  • 我最近偶然发现了这个代码: 我以前从未见过这个关键字。试图运行我得到的代码 分析错误:语法错误,第x行出现意外的T_变量 那么这个关键字是什么?它甚至是有效的PHP吗?如果是,我该如何使用它?

  • 我想创建一个

  • 问题内容: 在一个JavaScript文件中,我看到了: 声明并分配给它的目的是什么? 问题答案: 我将以一个插图开始这个答案: 我的回答最初是用jQuery演示的,只是略有不同: 由于在通过调用新函数更改范围时会经常更改,因此无法使用原始值访问原始值。将其别名为可以使您仍然访问的原始值。 就个人而言,我不喜欢使用as作为别名。它指的是什么几乎是不明显的,特别是如果函数长于几行。我 总是 使用更具

  • 问题内容: 这是什么? 这是有关警告,错误和注意事项的许多答案,这些警告,错误和注意事项在您对PHP进行编程时可能会遇到,并且不知道如何解决它们。这也是一个社区Wiki,因此邀请所有人参与添加并维护此列表。 为什么是这样? 诸如“已发送标题”或“呼叫非对象成员”之类的问题经常在堆栈溢出中弹出。这些问题的根本原因总是相同的。因此,这些问题的答案通常会重复它们,然后向OP显示在特定情况下应更改的行。这

  • 我最近看到新的Gmail API宣布吹嘘OAuth 2.0用户身份验证。 我有点担心,因为在我们的企业Google Apps域中,我已经使用XOAUTH2与Gmail集成。(从本质上讲,XOAUTH2 包括对 IMAP 身份验证的 OAuth 2.0 支持)。 我应该担心吗? 新的Gmail API是否意味着XOAUTH2的终结开始?

  • 问题内容: 下面是代码片段。 有人可以向我解释@符号在Java中的含义吗? 问题答案: 这是一个注释。 注释是元数据的一种形式。它们提供的程序数据不属于程序本身。注释对其注释的代码的操作没有直接影响。 注释确实会影响工具和库对待程序的方式,进而会影响正在运行的程序的语义。可以从源文件,类文件中读取注释,也可以在运行时从中读取注释。