php 中 new self() 和 new static()区别

在 PHP 中,new self()new static() 都用于创建当前类的实例,但它们在运行时绑定和继承上下文中的行为有所不同。

new self()

self 关键字引用的是当前类本身。无论在哪个类中调用它,它总是引用定义关键字的那个类。这意味着,如果你在父类的一个方法中使用 new self(),那么即使在子类中调用这个方法,它仍然会创建父类的实例,而不是子类的实例。

示例:

php 复制代码
class ParentClass {
    public function createInstance() {
        return new self();
    }
}

class ChildClass extends ParentClass {}

$child = new ChildClass();
$instance = $child->createInstance(); // 这将创建 ParentClass 的实例

new static()

static 关键字则不同,它引用的是调用该方法的类。这意味着如果你在父类的方法中使用 new static(),并且这个方法在子类中被调用,那么它将创建子类的实例,而不是父类的实例。这是 PHP 中的"late static binding"(延迟静态绑定)。

示例:

php 复制代码
class ParentClass {
    public function createInstance() {
        return new static();
    }
}

class ChildClass extends ParentClass {}

$child = new ChildClass();
$instance = $child->createInstance(); // 这将创建 ChildClass 的实例

总结:

  • new self() 总是创建当前类的实例,不管调用它的对象是什么。
  • new static() 创建调用该方法的类的实例,允许更灵活的继承和多态性。

因此,在需要根据调用上下文动态确定实例类型的情况下,new static() 是更合适的选择。而在需要确保总是创建某个特定类的实例时,new self() 更为适用。

相关推荐
阿巴斯甜9 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker9 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq952710 小时前
Andorid Google 登录接入文档
android
黄林晴11 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
BingoGo12 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack12 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android