Pergunta

O que estou tentando fazer é criar um modelo de domínio com um objeto PHP antigo simples. Estou criando uma biblioteca que fará todo o material da infraestrutura. Então, um dos meus modelos se parece com isso

class Project {
  public $id;
  public $name;
  public $typeId;

  private $type;

  public function getType() {
    return $this->type;
  }

  public function setType(Type $type) {
    $this->typeId = $type->id;
    $this->type = $type;
  }
}

Agora, se criar um novo projeto e ligar setType com um objeto de tipo válido e salve a instância do projeto usando o ORM, o projeto e o tipo são salvos. Mas então eu carrego o projeto e uso getType Método, quero que o ORM tenha modificado esse método de forma transparente para carregar o objeto a partir da atitude. Então, este método aqui:

public function getType() {
  return $this->type;
}

para ser transparentemente alterado para:

public function getType() {
  if (is_null($this->type) {
    $this->type = $this->adapter->findById('table', $this->typeId);
  }

  return $this->type; // or return parent::getType();
}

O outlet PHP usa o aval para criar uma classe proxy para o projeto chamada Project_Proxy, mas às vezes haverá subclasses do projeto, por isso estou procurando uma solução usando a API de reflexão, se houver uma maneira.

Eu pesquisei o Google, mas não encontrei de qualquer maneira para mudar um comportamento de método

Editar: Ou seria uma boa idéia usar o método de avaliação de avaliação para criar classes de proxy para meus modelos e todas as subclasses deles?

Foi útil?

Solução

Não há uma maneira incorporada de fazer isso. E embora você possa fazer isso usando o Extensão PECL chamada Runkit, Eu recomendo fortemente encontrar outra solução. Alterando a implementação de funções que você não pode conhecer nada sobre é muito perigoso e pode levar a bugs em que depurar um único bug pode levar mais tempo do que escrever o if (is_null(... declarações para tudo suas funções.

BTW: não use is_null(), pois você pode buscar valores nulos do banco de dados repetidamente. Você deve armazenar os valores buscados em uma variável separada.

Outras dicas

Olhando para a reflexão Doc No Php.net, parece -me que é impossível modificar no voo um método.

Você deve tentar fazer isso de uma maneira diferente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top