0

Instanciar classe dentro do construtor de outra classe

criado por André Taiar em 25/12/2009 7:09pm
Vamos supor o seguinte cenário:

Eu tenho uma classe qualquer, por exemplo, uma classe de controle de usuários. Tenho uma outra classe de tratamento abstrato de erros que permite tratar qualquer tipo de erros no sistema.

Eu gostaria de saber se isso cai em alguma má prática em POO, caso eu instancie a classe de erro no construtor da classe de controle de usuários e utilize tal objeto dentro de minha classe de controle. Por exemplo:

class controle
{

  private $error;

  public function __contruct($errObj)
  {
    if(!is_object($errObj))
      $this->error = new ERRO();
    else
      $this-> error = $errObj;
  }
}

Eu sei que eu poderia extender a classe de controle de usuários e teria um efeito funcional semelhante mas, semânticamente, isso não tem nada haver...


Alguma sugestão?

Lista de Respostas:

0
02/03/2010 7:01pm
(~8 anos atrás)
Marcos Regis respondeu:
Olá André. Não há má prática no código.
Inclusive isso é muito comum e em dado momento é altamente recomendável.

Por exemplo, em casos onde gostariamos que uma classe tenha as mesmas funcionalidades de duas classes diferentes é possível extender uma e usar a outra como um atributo já que não é possível extender mais de uma classe ao mesmo tempo e não sendo essa uma interface (Uma classe pode implementar mais de uma interface) não há outro jeito.

Outro exemplo. Quando se trabalha com Objetos que são listas de outros objetos podemos ter no construtor a necessidade de popular a lista e portanto teremos de instanciar essa classe até mesmo mais de uma vez.


0
02/03/2010 7:03pm
(~8 anos atrás)
Marcos Regis respondeu:
Ahh uma pequena correção no código.

Visto que o construtor somente será executado uma única vez para cada objeto não há necessidade de verificar se o objeto existe pois com certeza ele será nulo ao ser iniciada.
  public function __contruct($errObj)
  {
      $this-> error = new ERRO();
  }


Nova Resposta:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)