insérer une nouvelle fonction dans une classe lors de l'exécution

ViPHP
ViPHP | 5924 Messages

26 août 2008, 21:56

Alors j'aurais envie de dire que ce n'est pas possible. A la limite, les solutions possibles seraient :
- D'utiliser la méthode magique __call pour appeler une fonction, mais vu qu'il faut que la fonction soit dans le contexte objet, il faut l'évaluer par eval(), ce qui signifie que tu vas plomber tes performances, et éventuellement la sécurité.
- De générer toute la classe dynamiquement et la créer dans php par eval(), c'est encore pire que précédemment.
- De créer une classe fake englobant tes fonction et utiliser runkit et la fonction runkit_method_copy notamment pour copier ta méthode d'une classe à l'autre, mais c'est expérimental, éventuellement instable, et au comportement susceptible de changer.
- De changer ta structure et revoir tes contraintes, utiliser l'héritage par exemple, ou les relations entre objets, etc…

Donc tu l'auras compris, le problème est complètement dans une mauvaise conception de ton système, tu ne trouveras rien en explorant par là…

Eléphant du PHP | 259 Messages

27 août 2008, 13:38

bonjour

mais je ne peux pas savoir quelle classe héritée utiliser si je n'ai pas encore extrait les données sur la page

dans mon idée cette classe page doit controler toute l'exécution de la page, extraction des informations, mise en place de la méthode de traitement appropriée, exécution, génération du code

cette seconde classe pour exécuter une partie du travail en fonction de la page appelée m'arrange car les pages ont parfois besoin de plusieurs fonctions, donc dans ma classe page au final j'ai
	/****************************************************************************
	fonction d'execution pour générer le contenu de la page
	****************************************************************************/
	function execution()
		{
		if($this->securite()==true)
			{
			if(!empty($this->variables->page_destination)&&file_exists($this->variables->page_destination))
				{ 
				require($this->variables->page_destination); 
				
				$classe=$this->variables->page_classe;
				$page_execution=new $classe();
				$page_execution->generation()
				$this->contenu=$page_execution->resultat();
				}
			else 
				{ 
				//require('pages/erreur.php'); 
				//$global['erreur_page']='404';
				//fctpage_erreur();
				//require('lib/inc_index.php');
				echo'<br> ERREUR PAGE INTROUVABLE';
				}
			}
		else
			{
			header('Location: /index.php?page=erreur&erreur=1025&page_demandee='.$this->variables->page_nom);
			exit;
			}
		}
bien entendu vous allez me dire " qu'il s'agit d'une erreur de conception et qu'il faut tout revoir " mais ce genre de fonctionnement me vas très bien

++
l'hébergeur gratuit que j'utilisais: http://www.freeheberg.com (pas de limitte de débit, BP, 1à10Go, bdd mysql illimitées )
mainteant je suis chez OVH, payant mais plus adapté à de gros sites

ViPHP
ViPHP | 5924 Messages

27 août 2008, 16:52

Et alors, qu'est ce qui t'empèche d'inclure un fichier plutôt qu'un autre et donc une classe plutôt qu'une autre ? De même, rien ne t'empèche de stocker le nom de ta classe dans une variable…

Eléphant du PHP | 259 Messages

27 août 2008, 18:52

slt

mais n'est ce pas ce que je fais ?

+
l'hébergeur gratuit que j'utilisais: http://www.freeheberg.com (pas de limitte de débit, BP, 1à10Go, bdd mysql illimitées )
mainteant je suis chez OVH, payant mais plus adapté à de gros sites

ViPHP
ViPHP | 5924 Messages

27 août 2008, 19:02

Ce n'est pas ce que tu dis avoir fait :
avec une nouvelle classe qui génère le code et qui le donne ensuite à la classe chargée de gèrer la page
Une génération de code, cela implique l'évalution par eval() ou consors. Après ce n'est pas avec 3 lignes que je peux te répondre. Le fait d'inclure un fichier, ce n'est pas le principal. Si en effet tu inclues un fichier pour simplement faire exécuter une variable par évaluation dynamique (fonction eval), c'est débile, quand on sait que tu pourrais très bien te passer de cette évaluation.
Ce qu'il faut faire, c'est inclure un fichier contenant la définition de la classe, non inclure un fichier contenant une variable contenant la définition de la classe, car dans ce cas il n'y a absolument aucun intérêt…

Eléphant du PHP | 259 Messages

27 août 2008, 19:16

ahhh mais on s'est pas compris alors

quand je parle de générer le code , je parlais du code html des pages

c'est une classe que j'écris à la main avec toutes les instructions de la page en question, qui après retourne le code à la classe qui gère la page en général

je n'utilise pas de eval()
l'hébergeur gratuit que j'utilisais: http://www.freeheberg.com (pas de limitte de débit, BP, 1à10Go, bdd mysql illimitées )
mainteant je suis chez OVH, payant mais plus adapté à de gros sites

ViPHP
ViPHP | 5924 Messages

27 août 2008, 19:19

Ah, je préfère alors… Prends l'habitude d'utiliser les bons mots aux bons endroits…