Est-il possible de modifier les méthodes d'une instance d'objet en utilisant la réflexion
-
20-09-2019 - |
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
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.