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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top