You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中new static()与$this的区别及使用原因问询

Laravel Stringable中return new static()实现链式调用的原因及技术术语

核心技术术语

这种实现方式涉及两个关键概念:

  • 不可变对象(Immutable Object):对象一旦创建就无法被修改,任何"修改"操作都会返回一个全新的对象实例。
  • 延迟静态绑定(Late Static Binding):PHP中通过static关键字实现,它会指向当前实际调用的类(而非定义该方法的类),确保创建的新实例类型与调用者一致。

使用return new static()而非return $this的原因

  1. 保证对象不可变性
    Stringable的设计目标是提供安全的字符串操作,避免原对象被意外修改。用return new static()时,每个方法调用都会生成一个包含修改后内容的新Stringable实例,原实例的状态完全保留。比如:
$original = Str::of('hello');
$upper = $original->upper();
// $original 仍然是 'hello',$upper 是 'HELLO'

如果用return $this,方法会直接修改当前对象的内部状态,原实例会被污染,在多场景复用或并发环境中容易引发难以排查的bug。

  1. 支持子类继承的正确性
    如果有自定义子类继承Stringable,new static()会自动创建子类的实例,而非父类Stringable的实例。比如:
class CustomStringable extends Stringable {}

$custom = new CustomStringable('test');
$result = $custom->append('ing');
// $result 是 CustomStringable 实例,而非 Stringable 实例

要是用return $this,若父类方法里有创建新实例的逻辑,new self()会创建父类实例,破坏继承的多态性;而new static()则能保证实例类型与调用者一致,让子类继承后的链式调用行为符合预期。

  1. 链式调用的一致性
    所有方法都返回新实例,让链式调用的每一步都是独立的实例操作,逻辑更清晰。开发者可以随时中断链式调用,复用中间步骤的实例,而不用担心后续操作影响之前的结果。

内容的提问来源于stack exchange,提问作者user2123073

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 16:40:16