在PHP中,当我为应该返回该类实例的方法指定返回类型时,我可以这样做:
class Foo {
public function bar(): self { ... }
}
或:
class Foo {
public function bar(): Foo { ... }
}
两者似乎都产生相同的结果/行为。
有什么区别?是另一种最佳实践吗?
谢谢。
答案 0 :(得分:3)
有什么区别?
没有区别。
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
之后)对其进行重命名。
答案 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