Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > PDF
PDF Forum d'entraide sur la gestion dynamique de documents PDF avec PHP. Exemples : PDFLib, eZPdf, PhpToPdf... Avant de poster -> FAQ PDF et Cours PDF
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/08/2006, 19h07   #1
Nouveau Membre du Club
 
Homme Pascal Sandrez
Ingénieur développement matériel électronique
Inscription : janvier 2005
Messages : 101
Détails du profil
Informations personnelles :
Nom : Homme Pascal Sandrez
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement matériel électronique

Informations forums :
Inscription : janvier 2005
Messages : 101
Points : 34
Points : 34
Par défaut Probleme avec les include

Bonjour

J'ai un fichier php (A.php par exemple) qui réalise certaines opérations, et dont je récupère le résultat depuis un autre fichier (main.php) de cette manière :


Code :
1
2
3
4
5
//dans le fichier main.php
function get_data()
{<blockquote>include("A.php");
return (une variable provenant de A.php);
</blockquote>}
A chaque appel de get_data() les variables de A.php ont une portée interne à la fonction et sont donc détruites au return de la fonction get_data(), cependant les fonction de A.php ont une portée globale. C'est la que vient mon problème.
Depuis main.php j'ai besoin d'apeller get_data() plusieurs fois.
Cela marche bien lorsque la function get_data() est appelée une première fois, mais les fois suivantes => problème de redéclaration de fonction.
Je précise que mettre include_once() ne résout pas mon problème car dans ce cas le fichier A.php n'est executé qu'une fois et pas à chaque appel de get_data().

Le problème est assez ciblé (j'espère l'avoir bien décrit) mais je vois pas de solution simple. Avez vous une idée ?

Merci beaucoup de votre aide
Delphy113 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2006, 19h55   #2
Membre Expert
 
Avatar de Anduriel
 
Homme
Étudiant
Inscription : février 2004
Messages : 2 168
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2004
Messages : 2 168
Points : 1 277
Points : 1 277
Salut,

Je ne sais plus si les erreurs de redéclarations sont des Notice ou Warning. Si se sont des Notice, mets juste un @ devant la fonction pour masquer l'erreur.

Sinon est ce que ce ne serait pas possible d'inclure le fichier A.php avant toute fonction (dont get_data()) dans main.php, mais de rendre global les variables s'y trouvant pour les rendre disponibles aux fonctions qui suivent (dont get_data()) ?

Anduriel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2006, 21h05   #3
Rédacteur
 
Avatar de Yoshio
 
Homme
Inscription : septembre 2005
Messages : 1 741
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : Belgique

Informations forums :
Inscription : septembre 2005
Messages : 1 741
Points : 1 497
Points : 1 497
pourquoi ne pas initialiser tes variable de A à false ou '' ?!
Yoshio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2006, 22h07   #4
Nouveau Membre du Club
 
Homme Pascal Sandrez
Ingénieur développement matériel électronique
Inscription : janvier 2005
Messages : 101
Détails du profil
Informations personnelles :
Nom : Homme Pascal Sandrez
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement matériel électronique

Informations forums :
Inscription : janvier 2005
Messages : 101
Points : 34
Points : 34
Merci de vos réponses mais ce n'est pas si simple en fait. Dans le fichier A.php, il y a plusieurs opérations effectuées qui dépendent d'un paramètre de get_data().

Plus précisément cela est réalisé de cette façon
Code :
1
2
3
4
5
6
//dans le fichier main.php
function get_data($parametre)
{
      include("A.php");
      return (une variable provenant de A.php); 
}
A.php utilise la variable $parametre pour creer le resultat.

Le fichier A.php peut être executé seul (par requete http simple), il trouve son parametre dans $_GET et renvoi le resultat sur la sortie standard.
Dans le cas ou il est executé par un autre fichier, il ne renvoi rien sur la sortie standard, la fonction get_data me permet de récupérer le résultat. Ca aurait pu marcher trés bien avec file_get_contents mais je suis en safe_mode et je ne peux pas me servir de cette fonction.
Delphy113 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2006, 23h04   #5
Membre Expert
 
Avatar de Anduriel
 
Homme
Étudiant
Inscription : février 2004
Messages : 2 168
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2004
Messages : 2 168
Points : 1 277
Points : 1 277
J'ai tilté sur une chose que j'ai pas compris:

Citation:
Cela marche bien lorsque la function get_data() est appelée une première fois, mais les fois suivantes => problème de redéclaration de fonction.
Pourquoi tu redéclares la fonction plusieurs fois? Elle peut être appelée X fois sans problème de rédéclaration ?
Anduriel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2006, 23h23   #6
Membre Expert
 
Inscription : juillet 2004
Messages : 1 033
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 1 033
Points : 1 050
Points : 1 050
dans le fichier A.php dissocie fonction et usage. Et pour appeler tes fonctions utilise un require_once dans A.php.

Tu as un sérieux souci de conception.
ePoX est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2006, 23h29   #7
Nouveau Membre du Club
 
Homme Pascal Sandrez
Ingénieur développement matériel électronique
Inscription : janvier 2005
Messages : 101
Détails du profil
Informations personnelles :
Nom : Homme Pascal Sandrez
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement matériel électronique

Informations forums :
Inscription : janvier 2005
Messages : 101
Points : 34
Points : 34
en reposant mon probleme de facon différente :

Code :
1
2
3
4
5
6
7
function f1()
{
      function f2()
      {
            ....
      }
}
Dès l'appel de f1(), f2() est déclarée et a donc une portée globale, elle peut donc être appellé à volonté hors de f1(). Si f1() est apellée de nouveau, f2() est alors redéclarée => mon problème.
Plus d'explications : http://fr.php.net/manual/fr/language.functions.php
Une solution à mon problème : réduire la définition de f2() à l'interieur de f1() seul. Mais comment faire ?
Delphy113 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2006, 23h37   #8
Membre Expert
 
Avatar de Anduriel
 
Homme
Étudiant
Inscription : février 2004
Messages : 2 168
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2004
Messages : 2 168
Points : 1 277
Points : 1 277
La seule façon c'est de sortir ta fonction de A.php vers un autre fichier encore.
Anduriel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2006, 23h40   #9
Nouveau Membre du Club
 
Homme Pascal Sandrez
Ingénieur développement matériel électronique
Inscription : janvier 2005
Messages : 101
Détails du profil
Informations personnelles :
Nom : Homme Pascal Sandrez
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement matériel électronique

Informations forums :
Inscription : janvier 2005
Messages : 101
Points : 34
Points : 34
L'erreur est de type "Fatal error" donc pas de @ possible.

Sinon concernant la conception je suis plutot débutant, compte tenu de mes connaissance en programmation je suis impressionné par ce que j'ai déjà réalisé (j'ai commencé le HTML/CSS/javascript/PHP/mysql il y a 1 an et demi). Là où je viens d'améliorer considérablement mon site, je me rend compte aujourd'hui que j'aurais pu faire mieux (notament en faisant plus de classes), mais j'aimerais autant ne pas repartir à zéro. Je comprend les bases de la programmation orientée objet mais c'est pas naturel, tant pis je le saurais pour la prochaine fois...
Delphy113 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/08/2006, 23h46   #10
Membre actif
 
Avatar de renaudjuif
 
Inscription : avril 2006
Messages : 300
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 300
Points : 174
Points : 174
Salut,
Une question bête, pourquoi mettre f2() dans f1() ?
Il ne serait pas plus simple d'appeler f2() depuis f1()?
On utilise souvent un fichier du genre "common_functions.php" qui regroupe les fonctions appelées depuis différentes pages...
Ou alors si les fonctions sont indissociables, peut-être faire un objet, avecf1() comme constructeur.
renaudjuif est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2006, 00h12   #11
Membre Expert
 
Inscription : juillet 2004
Messages : 1 033
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 1 033
Points : 1 050
Points : 1 050
Citation:
Envoyé par Delphy113
en reposant mon probleme de facon différente :

Code :
1
2
3
4
5
6
7
function f1()
{
      function f2()
      {
            ....
      }
}
Dès l'appel de f1(), f2() est déclarée et a donc une portée globale, elle peut donc être appellé à volonté hors de f1(). Si f1() est apellée de nouveau, f2() est alors redéclarée => mon problème.
Plus d'explications : http://fr.php.net/manual/fr/language.functions.php
Une solution à mon problème : réduire la définition de f2() à l'interieur de f1() seul. Mais comment faire ?
d'ou le require_once.

fichier a.php
Code :
1
2
require_once("a.fonctions.php");
$toto = "r";
fichier a.fonctions.php
fichier main.php
De cette façon a.php sera inclut autant de fois que necessaire, et donc les variables seront ré attribuer ect.
Mais le fichier a.fonction.php ne sera appelé qu'une et une seule fois.
Donc tu n'auras plus de souci de fonction déja déclarés ect.

Sinon il existe une fonction qui s'appele function_exist( string func_name ).
Qui s'utlise ainsi :

Code :
1
2
3
4
if( function_exist( "toto") == false )
{
function toto(){}
}
Dans ce cas la tu peux évincer le require_once.

Je rajouterais que la conception n'est pa un domaine liés seulement à l'OO. L'OO n'à été inventé que pour formaliser et améliorer ce qui pouvait se faire en procédural à l'époque de jérusalem.
Mieu vaut un pondre un code bien chiader en procédural avec une conception correct, qu'une grosse m**** en OO juste parce que c'est la mode.

Citation:
... tant pis je le saurais pour la prochaine fois...
Il n'y à qu'en forgeant que l'on devient forgeron courage, c'est je pense la meilleure méthode pour apprendre en auto didacte. Essayer, observer, corriger, refaire, jusqu'à parvenir à quelque chose de bô.

Ceci dit, rien ne t'emepche aussi de te documenter, ou de demander de l'aide, avant de te lancer pour atteindre un résultat plus satisfaisant dès le premier coup xD

Fin voila.

bbye
ePoX est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2006, 00h26   #12
Membre actif
 
Avatar de renaudjuif
 
Inscription : avril 2006
Messages : 300
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 300
Points : 174
Points : 174
Ta réponse est pertinente, ePoX,
Citation:
Envoyé par ePoX
Je rajouterais que la conception n'est pa un domaine liés seulement à l'OO. L'OO n'à été inventé que pour formaliser et améliorer ce qui pouvait se faire en procédural à l'époque de jérusalem.
Mieu vaut un pondre un code bien chiader en procédural avec une conception correct, qu'une grosse m**** en OO juste parce que c'est la mode.
Je suis d'accord, il ne faut pas se lancer dans une méthode parce que tout le monde ne jure que par ça, mais quand on arrive à des problèmes tels que des fonctions inclues dans des fonctions, ne faut-il pas prendre un peu de recul et se demander si la structure est cohérente ? Elle l'est peut-être dans ce cas de figure, mais ça vaut la peine de se poser la question, non?

J'ai par exemple pour habitude, quand j'arrive à trop de boucles imbriquées, de m'arrêter et de me demander si c'est la bonne solution...
Je ne compte plus le nombre de fois où je suis reparti de zéro pour attaquer le problème différemment
renaudjuif est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2006, 08h27   #13
Membre actif
 
Avatar de MicroPuce
 
Inscription : mai 2004
Messages : 262
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 262
Points : 164
Points : 164
Salut,
J'avoue que :
Code :
1
2
3
4
5
6
7
function f1()
{
      function f2()
      {
            ....
      }
}
Ca me fait dresser les cheveux sur la tête (enfin, ceux qui restent ) Je savais même pas qu'on pouvait définir une fonction dans une autre fonction
Donc, je rejoins l'avis de quelques autres, tu as un problème de conception : essaie de sortir cette fonction et ça devrais résoudre ton problème. Je crains que les require_once ou autres ne te servent qu'à compliquer un peu plus ton code
A priori, je vois pas pourquoi tu serais obligé de définir cette fonction "imbriquée", ch'uis sur que tu peux faire autrement... Vérifie le découpage de ton fichier inclus, sorts en ce que tu utilises plusieurs fois (tes fonctions, par exemple) et utilise un include lorsque tu dois les appeler.
Continue à t'arracher les cheveux (si y t'en reste ), c'est comme ça qu'on avance...
Bon courage
MicroPuce est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2006, 09h29   #14
Nouveau Membre du Club
 
Homme Pascal Sandrez
Ingénieur développement matériel électronique
Inscription : janvier 2005
Messages : 101
Détails du profil
Informations personnelles :
Nom : Homme Pascal Sandrez
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement matériel électronique

Informations forums :
Inscription : janvier 2005
Messages : 101
Points : 34
Points : 34
Merci de vos réponses.

Pour préciser un petit peu plus, ca se passe comme ca :
Dans le fichier A.php :
Code :
1
2
3
4
5
Un peu de code qui se sert de f2() pour créer un fichier pdf.
function f2()
{
      ....
}
Donc si on apelle A.php, il renvoi le resultat sur la sortie standard.

Dans le fichier main.php
Code :
1
2
3
4
5
function get_data($parametre)
{
      include("A.php");
      return (une variable provenant de A.php); 
}
le fichier A.php ne renvoi rien sur la sortie standard, la fonction get_data() renvoi le résultat de A.php

Je voulais éviter de faire des milliers de fichiers, et en fait je m'en doutait un peu, il faut bien sortir la fonction f2() de A.php.
J'ai bien un fichier 'common.php' mais il y a tellement de fonctions que je voulais pas rajouter f2() qui n'est en fait utilisé que par A.php.
Sinon au sujet de la prog OO, je me rend compte que dans mon cas, ca aurait été justifié. Mais en commencant j'avais un peu de mal à modéliser tous les problèmes. Ca m'aurait évité de faire des include dans des fonctions.
Mais je vous rassure tout n'est pas si tordu dans le reste du site.
Par contre si vous avez des propositions de conception pour réaliser tout cela je suis preneur. Je me rends compte que c'est un peu foireux mais je sais pas trop quoi changer pour améliorer cela.
Delphy113 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h57.


 
 
 
 
Partenaires

Hébergement Web