Laravel中new static()与$this的区别及使用原因问询
Laravel Stringable中
return new static()实现链式调用的原因及技术术语 核心技术术语
这种实现方式涉及两个关键概念:
- 不可变对象(Immutable Object):对象一旦创建就无法被修改,任何"修改"操作都会返回一个全新的对象实例。
- 延迟静态绑定(Late Static Binding):PHP中通过
static关键字实现,它会指向当前实际调用的类(而非定义该方法的类),确保创建的新实例类型与调用者一致。
使用return new static()而非return $this的原因
- 保证对象不可变性
Stringable的设计目标是提供安全的字符串操作,避免原对象被意外修改。用return new static()时,每个方法调用都会生成一个包含修改后内容的新Stringable实例,原实例的状态完全保留。比如:
$original = Str::of('hello'); $upper = $original->upper(); // $original 仍然是 'hello',$upper 是 'HELLO'
如果用return $this,方法会直接修改当前对象的内部状态,原实例会被污染,在多场景复用或并发环境中容易引发难以排查的bug。
- 支持子类继承的正确性
如果有自定义子类继承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()则能保证实例类型与调用者一致,让子类继承后的链式调用行为符合预期。
- 链式调用的一致性
所有方法都返回新实例,让链式调用的每一步都是独立的实例操作,逻辑更清晰。开发者可以随时中断链式调用,复用中间步骤的实例,而不用担心后续操作影响之前的结果。
内容的提问来源于stack exchange,提问作者user2123073
相关产品推荐
相关产品推荐

