Est-il possible de modifier les méthodes d'une instance d'objet en utilisant la réflexion

StackOverflow https://stackoverflow.com/questions/1754084

Question

Ce que je suis en train de faire est de créer un modèle de domaine avec un objet Plain Old PHP. Le Je crée une bibliothèque qui fera tous les trucs d'infrastructure. Alors un de mes modèles ressemble à ceci

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;
  }
}

Maintenant, si créer un nouveau projet et appeler setType avec un objet de type valide et enregistrer l'instance de projet en utilisant l'ORM à la fois le projet et le type est enregistré. Mais je charge la méthode getType projet et de l'utilisation que je veux l'ORM avoir modifié cette méthode transparente pour charger l'objet de persitence. Ainsi, cette méthode ici:

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

être modifiée de manière transparente dans:

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

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

Sortie PHP utilise eval pour créer une classe proxy pour le projet appelé Project_Proxy mais parfois il y aura des sous-classes de projet, je suis si la recherche d'une solution en utilisant l'API de réflexion s'il y a un moyen.

Je recherche Google, mais ne l'ai pas trouvé de toute façon de changer un comportement de la méthode

Modifier: ou serait-il une bonne idée d'utiliser la méthode eval de sortie PHP pour créer des classes proxy pour mes modèles et toutes les sous-classes d'entre eux

Était-ce utile?

La solution

Il n'y a aucun moyen de le faire builtin. Et bien que vous pouvez le faire en utilisant le extension PECL appelé runkit , je recommande fortement de trouver une autre solution . Modification de la mise en œuvre des fonctions que vous ne pouvez pas savoir quoi que ce soit au sujet est très dangereux et peut conduire à des bugs où le débogage d'un seul tel bug peut prendre plus de temps que d'écrire les déclarations de if (is_null(... pour tous vos fonctions.

BTW: ne pas utiliser is_null(), puisque vous pouvez chercher des valeurs nulles de la base de données encore et encore. Vous devez stocker les valeurs récupérées dans une variable séparée.

Autres conseils

En regardant le reflet doc sur php.net, il semble moi, il est impossible de modifier sur le vol d'une méthode.

Vous devriez essayer de le faire d'une manière différente.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top