类型提示返回类型时,:self和ClassName之间的区别

时间:2018-08-17 21:12:51

标签: php return-type type-hinting

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

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

或:

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

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

有什么区别?是另一种最佳实践吗?

谢谢。

2 个答案:

答案 0 :(得分:3)

  

有什么区别?

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

您可以将其视为正在定义的类的替代名称, 因此,在您的示例中,selfFoo的替代名称。 换句话说,您可以随时使用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之后)对其进行重命名。

答案 1 :(得分:0)

两者之间有区别。 区别在于返回类名,在这种情况下,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