php 7.1 中如何表示return类型是当前子类型?
How to indicate in php 7.1 that the return type is the current child type?
我有
abstract class A{
public static function getSingle($where = []) {
$classname = get_called_class();
$record = static::turnTheWhereIntoArecordFromDB($where);
$model = new $classname($record);
return $model;
}
}
class B extends A{
}
$x = B::getSingle();
$x
没有类型提示... 我喜欢类型提示,所以我想要 B
的类型提示,而不是 A
如何直接为 $x
启用类型提示?
我觉得是这样的
public function getSingle($where = []) : ?get_called_class()
这显然行不通
有什么功能吗?
将 @method B getSingle
添加到 B
class phpdoc。
/**
* Class B
* @method B getSingle
*/
class B extends A{
}
对于您提供的示例,为什么需要工厂方法?您正在从构造函数创建一个新实例,为什么不 $x = new B($record)
!
以上更新
abstract class A
{
/**
* @param array $where
* @return static
*/
public static function getSingle($where = [])
{
$classname = get_called_class();
$model = new $classname($record);
return $model;
}
}
@return static
将键入提示其子项 class。另外我把你的函数改成了静态函数,这是典型的工厂模式。
让抽象 class 实现一个接口并类型提示该接口。 child 不必显式实现接口。
abstract class A implements BarInterface
{
public function foo (): BarInterface
{
return new static;
}
}
我知道您指定了 PHP 7.1,但是从 PHP 8(将于 2020 年 11 月发布)开始 这将通过添加 static
return 输入提示.
The RFC was approved unanimously, 54-0.
这意味着您将能够做到:
class Foo
public static function build(): static
{
return new static();
}
}
class Bar extends Foo {}
此外,无需与 $classname = get_called_class(); new $classname();
打交道。您可以简单地执行 new static()
,这更简洁并且具有相同的结果。
并且 Bar::build()
是类型提示,表明它 return 是 Bar
而不是 Foo
由于后期静态绑定。
我有
abstract class A{
public static function getSingle($where = []) {
$classname = get_called_class();
$record = static::turnTheWhereIntoArecordFromDB($where);
$model = new $classname($record);
return $model;
}
}
class B extends A{
}
$x = B::getSingle();
$x
没有类型提示... 我喜欢类型提示,所以我想要 B
的类型提示,而不是 A
如何直接为 $x
启用类型提示?
我觉得是这样的
public function getSingle($where = []) : ?get_called_class()
这显然行不通
有什么功能吗?
将 @method B getSingle
添加到 B
class phpdoc。
/**
* Class B
* @method B getSingle
*/
class B extends A{
}
对于您提供的示例,为什么需要工厂方法?您正在从构造函数创建一个新实例,为什么不 $x = new B($record)
!
以上更新
abstract class A
{
/**
* @param array $where
* @return static
*/
public static function getSingle($where = [])
{
$classname = get_called_class();
$model = new $classname($record);
return $model;
}
}
@return static
将键入提示其子项 class。另外我把你的函数改成了静态函数,这是典型的工厂模式。
让抽象 class 实现一个接口并类型提示该接口。 child 不必显式实现接口。
abstract class A implements BarInterface
{
public function foo (): BarInterface
{
return new static;
}
}
我知道您指定了 PHP 7.1,但是从 PHP 8(将于 2020 年 11 月发布)开始 这将通过添加 static
return 输入提示.
The RFC was approved unanimously, 54-0.
这意味着您将能够做到:
class Foo
public static function build(): static
{
return new static();
}
}
class Bar extends Foo {}
此外,无需与 $classname = get_called_class(); new $classname();
打交道。您可以简单地执行 new static()
,这更简洁并且具有相同的结果。
并且 Bar::build()
是类型提示,表明它 return 是 Bar
而不是 Foo
由于后期静态绑定。