gpt4 book ai didi

php - 为什么要返回新的静态? (PHP)

转载 作者:IT王子 更新时间:2023-10-28 23:57:55 27 4
gpt4 key购买 nike

为什么有些开发人员会创建一种返回新静态的方法?有一个返回新静态的方法的原因是什么? 我不是在问 static 和 self 之间有什么区别,或者 static 和 self 是什么意思。例如,这是一个简单的类:

<?php

class Expression
{
public static function make()
{
return new static;
}


public function find($value)
{
return '/' . $value .'/';
}

public function then($value)
{
return $this->find($value);
}

public function hi($value)
{
return "hi";
}

}

如您所见,有一个static 方法ma​​ke() 返回new static。然后,一些开发人员像这样调用其他方法:

$regex = Expression::make()->find('www');

这样做的目的是什么?我看到这里我们没有使用 new Expression 语法,如果这就是重点 - 那么为什么不将所有方法设为静态呢?有什么区别,为什么要使用返回 new static 的方法(而其他方法不是静态的)?

最佳答案

new static 从当前类实例化一个新对象,并使用后期静态绑定(bind)(如果类被子类化,则实例化子类,我希望你明白这一点)。

在类上使用static 方法返回一个新实例是一个替代构造函数。这意味着,通常您的构造函数是 public function __construct,并且通常它需要一组特定的参数:

class Foo {
public function __construct(BarInterface $bar, array $baz = []) { ... }
}

拥有一个替代构造函数允许您提供不同的默认值,或方便的快捷方式来实例化此类,而无需提供那些特定的参数和/或能够提供替代构造函数将提供的不同参数转换为规范的:

class Foo {

public function __construct(BarInterface $bar, array $baz = []) { ... }

public static function fromBarString($bar) {
return new static(new Bar($bar));
}

public static function getDefault() {
return new static(new Bar('baz'), [42]);
}

}

现在,即使您的规范构造函数需要一堆复杂的参数,您也可以创建类的默认实例,这可能适合大多数用途,只需使用 Foo::getDefault().

PHP 中的典型示例是 DateTimeDateTime::createFromFormat .

在您的具体示例中,替代构造函数实际上没有执行任何操作,因此它是多余的,但我希望这是因为它是一个不完整的示例。如果确实有一个除了 new static 之外什么都不做的替代构造函数,它可能只是作为 (new Foo)-> 的便利语法,我认为这是有问题的。

关于php - 为什么要返回新的静态? (PHP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37460592/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com