为什么要返回新的静态?(菲律宾比索)

2022-08-30 10:31:10

为什么有些开发人员创建了一个返回新静态的方法?有什么原因需要一个返回新静态的方法?我不是在问静态和自我之间的区别是什么,或者静态和自我意味着什么。例如,下面是一个简单的类:

<?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";
    }

}

如您所见,有一个静态方法 make() 返回新的 static。然后,一些开发人员调用其他方法,如下所示:

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

这样做的目的是什么?我看到这里我们没有使用新的表达式语法,如果这是重点 - 那么为什么不让所有方法都是静态的呢?有什么区别,有什么原因让一个方法返回新的静态(而其他方法不是静态的)?


答案 1

new static实例化当前类中的新对象,并使用后期静态绑定(如果类被子类化,则实例化子类,我希望您理解这一点)。

在返回相同新实例的类上拥有一个方法是另一种构造函数。这意味着,通常你的构造函数是 ,通常它需要一堆参数:staticpublic 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中的规范示例是和DateTime::createFromFormatDateTime

在你的具体例子中,替代构造函数实际上并没有做任何事情,所以它是相当多余的,但我预计这是因为它是一个不完整的例子。如果确实有一个替代构造函数,除了 ,它可能只是为了方便语法,我觉得这值得怀疑。new static(new Foo)->


答案 2

在这里完成答案

TLDR
get_called_class().

class A {
    public static function get_self() {
        return new self();
    }

    public static function get_static() {
        return new static();
    }
}

class B extends A {}

echo get_class(A::get_self()); // A
echo get_class(A::get_static()); // A
echo get_class(B::get_self());  // A
echo get_class(B::get_static()); // B

推荐