如何在抽象類上提示靜態單例返回方法,該方法返回擴展調用類的實例?類型暗示抽象類單例
例如,讓我們來看看下面的代碼:
<?php
abstract class Foo {
/** @return Foo */
public function init() {
static $instance;
if (is_null($instance)) {
$class = get_called_class();
$instance = new $class();
}
return $instance;
}
}
class Bar extends Foo {
public $name = "Bar name";
}
class Baz extends Foo {
public $age = 42;
}
我的本意是工具,如PhpStorm明白Bar::init()
返回Bar
類型的對象和Baz::init()
返回Baz
類型的對象。因此,例如,從Baz::init()
方法創建的對象將自動完成name
屬性,但不會自動完成age
屬性。
顯然,當前類型提示@return Foo
是錯誤的,因爲該方法永遠不會返回抽象類的對象實例。
'@return Foo'沒有錯,因爲函數返回的是一個'instanceof Foo'的對象,即使該對象是'Foo'的子元素,但是如果你想要一個準確的類提示,你可能會逃脫'@return static'(也許)。而且這一切都是IDE提示,所以它也取決於你的IDE足夠聰明以理解它的含義。 – apokryfos
@apokryfos:謝謝。事實上,我曾考慮在該問題中添加一個PhpStorm標籤。 – dotancohen
爲什麼你想讓你的代碼在每次運行中重構? –