Php 类型暗示返回类型时self和ClassName之间的区别

Php 类型暗示返回类型时self和ClassName之间的区别,php,return-type,type-hinting,Php,Return Type,Type Hinting,在PHP中,当我为应该返回类实例的方法指定返回类型时,我可以这样做: class Foo { public function bar(): self { ... } } 或: 两者似乎产生相同的结果/行为 有什么区别?一种最佳实践是否优于另一种 谢谢 有什么区别 没有区别。 self是指类本身的关键字 您可以将其视为正在定义的类的替代名称, 因此,在您的示例中,self是Foo的另一个名称。 换句话说,您可以使用self来替换Foo,只要您愿意, 当然,除了紧跟在类关键字之后 以下

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

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

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

有什么区别?一种最佳实践是否优于另一种

谢谢

有什么区别

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

您可以将其视为正在定义的类的替代名称, 因此,在您的示例中,
self
Foo
的另一个名称。 换句话说,您可以使用
self
来替换
Foo
,只要您愿意, 当然,除了紧跟在
关键字之后

以下是一个例子:

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
之后)重命名它。

两者之间有区别。 不同之处在于,返回类名(如本例中的
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

关于答案。对不起,这只是我的错误。非常感谢。
class Foo
{
    public function bar(): self { ... }

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

class BabyFoo extends Foo
{
}

$instance = new BabyFoo();