I just knocked this up to confirm my thinking was right:
<?php class StdFeature { } class AppFeature extends StdFeature { } class FactoryBase { public function new_feature() : StdFeature { return new StdFeature; } } class Factory extends FactoryBase { public function new_feature() : AppFeature { return new AppFeature; } } $factory = new Factory(); $feature = $factory->new_feature(); assert( is_a( $feature, 'AppFeature' ) );