在 PHP 中,当我为应该返回类实例的方法指定返回类型时,我可以这样做:
class Foo {
public function bar(): self { ... }
}
或者:
class Foo {
public function bar(): Foo { ... }
}
两者似乎都产生相同的结果/行为。
有什么不同?一种最佳实践优于另一种吗?
谢谢。
在 PHP 中,当我为应该返回类实例的方法指定返回类型时,我可以这样做:
class Foo {
public function bar(): self { ... }
}
或者:
class Foo {
public function bar(): Foo { ... }
}
两者似乎都产生相同的结果/行为。
有什么不同?一种最佳实践优于另一种吗?
谢谢。
两者是有区别的。不同之处在于返回类名,因为在这种情况下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
有什么不同?
没有区别。
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
)。