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() 更为适用。

相关推荐
cd小白6 分钟前
Linux第二课:LinuxC高级 学习记录day04
linux·开发语言·学习
_可乐无糖1 小时前
跨平台实践:python中如何检查当前操作系统
android·python·ui·ios·appium·自动化
生信天地1 小时前
PHP与HTML、CSS、JavaScript、jQuery的关系**
javascript·html·php
daily_23331 小时前
c++领域展开第十二幕——类和对象(STL简介——简单了解STL)超详细!!!!
开发语言·c++
上位机付工1 小时前
C#轻松实现ModbusTCP服务器接口
服务器·开发语言·c#·modbustcp服务器
SomeB1oody1 小时前
【Rust自学】12.7. 使用环境变量
开发语言·后端·重构·rust
mosen8682 小时前
Uniapp判断设备是安卓还是 iOS,并调用不同的方法
android·ios·uni-app
clp200311012 小时前
【Javascript Day8】计算机存储方式、方法定义方式、作用域、预解析、对象
开发语言·javascript·ecmascript
self-abasedAshuai2 小时前
C# Winform:项目引入SunnyUI后,显示模糊
开发语言·c#
Code花园2 小时前
Bash语言的多线程编程
开发语言·后端·golang