Page 1 sur 2

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

Posté : 11 août 2008, 21:41
par yuuzhantar
Bonjour

pour générer les pages de mon site, je suis en train de créer un framework perso

je viens de tout passer en POO et je bloque sur un point :

quand on demande une page, on vérifie dans la bdd si elle existe, on charge une fichier qui contient une ou plusieurs fonctions, et on execute la fonction donnée dans la bdd

je voulais savoir comment je pourrais ajouter à la classe page, qui gère toute l'exécution de la page, une nouvelle fonction que l'on irait piocher dans un autre fichier php

sans faire d'include ... car çà crérait une fonction au sein d'une fonction

voila, si vous avez des idées n'hésitez pas

merci

Re: insérer une nouvelle fonction dans une classe lors de l'

Posté : 11 août 2008, 23:22
par Sékiltoyai
sans faire d'include ... car çà crérait une fonction au sein d'une fonction
??
Que veux tu dire par là ?
Par ailleurs, ton message est plutôt incompréhensible…

Posté : 12 août 2008, 10:14
par Berzemus
huh ? Est-ce que tu voudrais ajouter une méthode à un objet ou à une classe ?

Posté : 12 août 2008, 13:28
par yuuzhantar
slt

ce serait plutôt à un objet

++

Posté : 12 août 2008, 13:35
par Sékiltoyai
Tu peux expliquer clairement (et en bon français) ce que tu veux ?

Posté : 12 août 2008, 14:47
par Hywan
Hey :),

Je ne veux pas insister mais c'est vrai qu'on ne comprend rien à ce que tu veux dire. N'oublie pas une chose : « ce qui ce conçoit bien s'énonce clairement, et les mots pour le dire viennent aisément ». Exposes donc ton problème clairement, avec des exemples, voir même des bouts de code si ça peut t'aider à être plus clair. On est prêt à fournir un effort, mais tu dois en faire autant.

Posté : 12 août 2008, 20:05
par yuuzhantar
bonjour

je vais réexpliquer

je fait mon framework perso
quand un visiteur demande une page, on passe une adresse de type
j'extrait la variable
$page_nom=$_GET['page']
je fais une "protection" contre les injections ...

je créé une instance de la classe page
je lui fait vérifier si la page existe ( on regarde dans la bdd )
$page=new page();
$page->creation($page_nom);
après plusieurs étapes de vérifications ( autorisations ... )
on passe à l'exécution de la page

cette exécution se traduit par une ou plusieurs fonctions avec des suites d'actions
qui sont stockées sur un autre fichier php

j'aimerais savoir comment faire pour ajouter ces fonctions au sein de la classe

comme çà après je fais

$page->execution();

et dans la fonction execution :
$this->$page_fonction();
voila

merci

Posté : 12 août 2008, 20:22
par Sékiltoyai
Est ce que tes fonctions doivent avoir accès au contexte de l'objet ?
Tes fonctions sont dans des fichiers php ?

Posté : 12 août 2008, 20:24
par yuuzhantar
qui sont stockées sur un autre fichier php
oui elles sont dans des fichiers php

et oui elles agissent sur l'objet

merci

Posté : 13 août 2008, 00:58
par Sékiltoyai
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à…

Posté : 13 août 2008, 08:24
par Tracker
Tu es en train de décrire un héritage tout simple (mais vu avec un oeil de gars qui fait du procédural).

-1, à un moment si tu connais les méthodes utilisables sur ton objet, c'est qu'à mon avis tu aurais très bien pu en faire une classe héritant de page.
-2, l'analyse de ton URL n'aboutit pas à la création d'une classe page générique, mais à l'instanciation de ton objet spécialisé (évoqué plus haut), héritant de page et créé via un pattern Factory.


Sinon, si franchement la liste des traitements chainés dans ta méthode page::execute() n'est réellement pas déterminable à la conception (ce qui m'étonnerait lourdement), tu peux très bien dans le corps de ta méthode execute(), faire des includes dynamiques effectués au runtime.


Tracker.

Posté : 20 août 2008, 19:10
par Julien Breux
Par contre ne confond pas Objet et Classe !

Une classe est un modèle d'objet !

Un objet est une instance de classe !

Posté : 25 août 2008, 15:18
par yuuzhantar
slt

je me suis débrouillé
avec une nouvelle classe qui génère le code et qui le donne ensuite à la classe chargée de gèrer la page

merci quand même

+

Posté : 25 août 2008, 18:30
par Sékiltoyai
Permet moi de te dire que ta solution est tout simplement abbérante, pour les raisons suscitées…

Posté : 26 août 2008, 20:05
par yuuzhantar
bonjour

pourrais tu me dire pourquoi ma solution est-elle ci abbérante ?

merci