¿Es posible modificar los métodos de una instancia de objeto utilizando la reflexión
-
20-09-2019 - |
Pregunta
Lo que estoy tratando de hacer es crear un modelo de dominio con un objeto Plain Old PHP. La estoy creando una biblioteca que va a hacer todas las cosas de la infraestructura. Así que uno de mis modelos se parece a esto
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;
}
}
Ahora bien, si crear un nuevo proyecto y llamar setType
con un objeto de tipo válida y guardar la instancia del proyecto usando el ORM se guarda el proyecto y tipo. Pero entonces me carga el método getType
proyecto y el uso que quiero el ORM de haber modificado este método transparente para cargar el objeto de persitence. Así que este método aquí:
public function getType() {
return $this->type;
}
para cambiar de forma transparente en:
public function getType() {
if (is_null($this->type) {
$this->type = $this->adapter->findById('table', $this->typeId);
}
return $this->type; // or return parent::getType();
}
Outlet PHP utiliza eval para crear una clase de proxy para el proyecto llamado Project_Proxy pero a veces no habrá subclases de proyecto, así que estoy en busca de una solución mediante el uso de la API de reflexión si hay una manera.
Tengo búsqueda de Google, pero no he encontrado de todos modos para cambiar un comportamiento método
Editar:? o sería una buena idea utilizar el método eval de salida de PHP para crear clases de proxy para mis modelos y todas las subclases de ellos
Solución
No hay manera de hacer esto incorporado. Y a pesar de que puede hacer que el uso de la extensión PECL llamada runkit , no te recomiendo encontrar otra solución . Cambio de la ejecución de las funciones no se puede saber lo sobre es muy peligroso y puede dar lugar a errores en la depuración de una sola de tales bichos puede llevar más tiempo que escribir las declaraciones if (is_null(...
para todos sus funciones.
Por cierto: no utilice is_null()
, ya que podría ir a buscar valores nulos de la base de datos una y otra vez. Debe almacenar los valores inverosímiles en una variable independiente.
Otros consejos
En cuanto a la reflexión doc en php.net, parece me es imposible modificar en el vuelo de un método.
Usted debe tratar de hacerlo de una manera diferente.