Bom, no banco de dados você tem uma tabela pra guardar o tipo.
1 - TipoDeAvalicacao1
2 - Tipo2DeAvalicacao2
No Select provavelmente terá
SELECT
avaliacao.id,
avaliacao.nome,
tipo.id,
tipo.nome --Então voce pode usar o nome aqui
FROM avaliacao
INNER JOIN tipo ON tipo.id = avaliacao.tipo_id
Agora pra criar o objeto de acordo com o tipo, usando uma factory.
interface TipoDeAvaliacao
{
public function getId();
//Outras abstrações aqui
}
class TipoDeAvalicacao1
{
private $id = 1;
public function getId()
{
return $this->id;
}
//Outros Métodos específicos do tipo aqui
}
class TipoDeAvalicacao2
{
private $id = 2;
public function getId()
{
return $this->id;
}
//Outros Métodos específicos do tipo aqui
}
class TipoAvaliacaoFactory()
{
public function create( $tipo )
{
if( class_exists( $tipo ) )
return new {$tipo}();
else
throw new Exception( "Tipo de Avalicacao $tipo não existe");
}
}
Bom, mas e na hora de gravar?
Provavelmente você também terá um select no HTML onde o usuário seleciona o tipo de prova na hora de gravar ou editar. Você também poderá usar o nome ao invés do id.
//No Select
<select name="tipo_avaliacao">
<option value="TipodeAvaliacao1">TipodeAvaliacao1</option>
<option value="TipodeAvaliacao2">TipodeAvaliacao2</option>
</select>
E quando receber o post faria
$tipo = $_POST['tipo_avaliacao'];
//Criando a Avaliacao
$avaliacao = new Avalicao();
//Setando o que é preciso..
//Setando o tipo da avaliação
$tipoAvaliacao = (new TipoAvaliacaoFactory())->create($tipo);
$avaliacao->setTipo( $tipoAvaliacao );
Se você acha que pode haver criações e edições de tipos com bastante frequência. Aborte esse negócio de criar uma classe pra cada tipo e deixa tudo no banco, porque se não você vai ter que alterar o código toda vez que alguém quiser criar um tipo novo.