4

我有

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()

这显然行不通

有什么可以做的吗?

4

4 回答 4

3

对于您提供的示例,为什么需要工厂方法?您正在从构造函数创建一个新实例,为什么不这样做$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将键入提示其子类。我也将您的功能更改为静态功能,这是典型的工厂模式。

于 2017-09-22T16:17:26.810 回答
1

我知道您指定了 PHP 7.1,但是从 PHP 8(将于 2020 年 11 月发布)开始,这将通过添加static返回类型提示来实现。

RFC 以 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()类型提示表明它返回Bar而不是Foo由于后期静态绑定。

于 2020-02-11T11:17:49.017 回答
1

添加@method B getSingleB类 phpdoc。

/**
* Class B
* @method B getSingle
*/
class B extends A{

}

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

于 2017-09-22T16:14:50.333 回答
0

让抽象类实现一个接口并类型提示该接口。孩子不必显式地实现接口。

abstract class A implements BarInterface
  {
    public function foo (): BarInterface
      {    
        return new static;
      }
  }
于 2017-09-22T20:41:53.560 回答