Décharger classe dynamique en PHP
J'ai mis en place le chargement dynamique des plugins de la manière suivante:
function processPlugin( $plgFile, $db ) {
require_once( $plgFile );
$plgin = new PlginImpl();
$plgin->setDb($db);
$ret = $plgin->process();
return $ret;
}
Chaque plugin définit une classe nommée PlginImpl
, qui fonctionne très bien. Mais il devrait être possible de convoquer d'autres plugins spécifié dans l'intérieur de la valeur de retour de process()
. Qui ferait la même méthode indiquée ci-dessus, mais échoue avec:
Fatal error: Cannot redeclare class PlginImpl in ..
Veuillez noter que chaque plugin est une classe, c'est à dire:
class PlginImpl extends Plugin implements PluginInterface
Plugin
offre quelques fonctions utiles tout en PluginInterface
définit c'est à dire process()
.
Je suppose que le fait que tous les plugins sont nommés PlginImpl les causes du problème, d'où ma question: est-il un moyen de décharger une classe (PlginImpl
) après le chargement avec require_once
? Ou est-il une approche totalement différente, je devrais suivre?
MODIFIER
J'ai essayé sans réussir les choses suivantes:
- unset
$plgin
aprèsprocess()
- appel
__destruct()
- il n'a pas de travail ni dansprocessPlugin()
ni dans lesprocess
méthode
Vous devez vous connecter pour publier un commentaire.
Puisque vous ne pouvez pas décharger une classe après que vous avez chargé, la seule option que vous avez est de renommer chaque plugin.
PluginX, PluginY, etc., mais il ne devrait pas que vous pouvez juste les forcer à utiliser l'interface du plugin que vous avez montré.
Pour charger un plugin spécifique, vous pouvez tout simplement quelque chose comme solomongaby suggère, mais au lieu d'un nom de fichier, vous passer le nom du plugin.. quelque chose comme ceci:
Une autre option, bien que je ne le recommande pas, est d'utiliser runkit_import.
Je ne suis pas sûr à 100%, mais je ne crois pas que vous pouvez décharger une classe une fois qu'il est déclaré.
Cependant, il y est une façon d'accomplir ce que vous essayez de faire.
Nom de chaque classe différemment et de détruire une classe avant de créer le suivant:
Vous aurez des extra classes définies traîner, mais d'en désactiver le plugin une fois chargé devraient minimiser les problèmes de mémoire.
Je sais que la question a été posté il y a plusieurs années, mais j'ai écrasé à cette question aujourd'hui, j'espère que ce journal pourrait aider comment vais avoir le même problème à l'avenir.
Comme il'has été mentionné dans de nombreuses réponses, PHP (au moins jusqu'à 5.3) ne permet pas de décharger les classes; ce que l'on peut faire est d'éviter les conflits entre les noms. En gardant cela à l'esprit, j'ai écrit un code qui charge chaque plugin dans un espace de noms unique.
Le plugin écrivains doivent être conscients que référencé classes sont destinées au contexte que l'hôte crée pour son.
Vous pourriez chercher à avoir le plgun->process() appel de la méthode le déconstructeur http://ca.php.net/manual/en/language.oop5.decon.php
Ou
Vous pourriez avoir le résultat de $plgin->process() stockées dans un temp var et puis unset($plgin)
Cependant, je pense que vous êtes probablement l'approche du problème dans une voie difficile.
Vous devriez peut-être avoir une classe de Plugin et ensuite mettre en Œuvre() une méthode.
je voudrais faire une classe permettant de gérer le chargement des plugins
et pour l'utiliser, il faudrait d'abord faire un
et ensuite de charger un plugin