Есть ли правильный способ условно создавать определенные подклассы?
Например, у меня есть User
класс, который включает метод get_membership()
который вернет подкласс в зависимости от типа членства, которому он был передан. В настоящее время я использую оператор switch для возврата правильного подкласса, однако я не уверен, что это лучший подход.
Краткий пример того, с чем я работаю:
class User
{
public $user_id;
public function __construct( $user_id )
{
$this->user_id = $user_id;
}
public function get_membership( $membership_type = 'annual' )
{
switch( $membership_type )
{
case 'annual':
return new AnnualMembership( $this->user_id );
break;
case 'monthly':
return new MonthlyMembership( $this->user_id );
break;
}
}
}
abstract class UserMembership
{
protected $user_id;
protected $length_in_days;
public function __construct( $user_id )
{
$this->user_id = $user_id;
$this->setup();
}
abstract protected function get_length_in_days();
abstract protected function setup();
}
class AnnualMembership extends UserMembership
{
public function setup() {
$this->length_in_days = 365;
}
public function get_length_in_days()
{
return $this->length_in_days;
}
}
class MonthlyMembership extends UserMembership
{
public function setup() {
$this->length_in_days = 30;
}
public function get_length_in_days()
{
return $this->length_in_days;
}
}
Можно условно создать экземпляр правого подкласса, хотя обычно рекомендуется разделить эту логику на другой класс / метод, называемый factory
. На самом деле, это очень распространенный design pattern
.
Других решений пока нет …