Php 类型暗示返回类型时self和ClassName之间的区别
在PHP中,当我为应该返回类实例的方法指定返回类型时,我可以这样做: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,只要您愿意, 当然,除了紧跟在类关键字之后 以下
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();