É possível modificar métodos de uma instância de objeto usando reflexão
-
20-09-2019 - |
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?
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.