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{

}

https://docs.phpdoc.org/references/phpdoc/tags/method.html

对于您提供的示例,为什么需要工厂方法?您正在从构造函数创建一个新实例,为什么不 $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 由于后期静态绑定。