2016-02-18 2 views
0

Угадайте, что это невозможно для Hacklang?Самостоятельная/детская статическая конструкция (хакланг)

<?hh //strict 

abstract class Foo { 

    public static function bar():void { 

     $class = get_called_class(); 
     $instance = new $class(); 

     // do stuff 

    } 
} 

не может использовать новое на имя класса 'Foo'; Аргументы __construct не гарантируется быть последовательными в дочерних классах (Typing [4060])

ответ

3

Вы должны аннотировать класс с <<__ConsistentConstruct>> - так как вы можете изменить подпись конструктора в подклассы по умолчанию, конкретизация будет быть небезопасным иначе, поскольку список аргументов мог быть изменен. Вы можете прочитать больше либо с official documentation, либо в this blog post I wrote giving a bit more of a narrative around the feature.

Как и в сторону, вы можете заменить

$class = get_called_class(); 
$instance = new $class(); 

с гораздо приятнее

$instance = new static();