3

在 PHP 中,当我为应该返回类实例的方法指定返回类型时,我可以这样做:

class Foo  {
    public function bar(): self  { ... }
}

或者:

class Foo  {
    public function bar(): Foo  { ... }
}

两者似乎都产生相同的结果/行为。

有什么不同?一种最佳实践优于另一种吗?

谢谢。

4

2 回答 2

7

两者是有区别的。不同之处在于返回类名,因为在这种情况下Foo将返回返回的特定类(不是子类),而返回self将返回实例化对象的类(即使它是定义方法的类的子类) .

例如,

class Foo
{
    public function bar(): self { ... }

    public function rab(): Foo { ... }
}

class BabyFoo extends Foo
{
}

$instance = new BabyFoo();

在上面的代码片段中, $instance->bar()将返回BabyFoo ,而 $instance->rab()将返回Foo

于 2020-11-03T07:43:09.660 回答
4

有什么不同?

没有区别。 self是指类本身的关键字。

您可以将其视为正在定义的类的替代名称,因此在您的示例self中是Foo. 换句话说,你可以在任何你想要的地方使用self替换,当然Foo除了class关键字之后。

这是一个例子:

class Foo {
    const HELLO = 'Hello!';

    public function bar(): Foo {
        echo Foo::HELLO;
        return new Foo;
    }
}

这与此完全相同:

class Foo {
    const HELLO = 'Hello!';

    public function bar(): self {
        echo self::HELLO;
        return new self;
    }
}

一种最佳实践优于另一种吗?

不,只需使用对您最方便或最有用的那个。

我通常更喜欢使用self这样,如果我需要重命名类,我只需要在一个地方重命名它(就在 之后class)。

于 2018-08-18T09:21:40.090 回答