Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1960 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Des objets en attributs de classe.

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

Des objets en attributs de classe.

n°1529026
Misssardon​ik
prévisible a posteriori
Posté le 15-03-2007 à 18:13:13  profilanswer
 

Bonjour,

 

Je me suis mis récement à la programmation en PHP/MySQL, et là je bloque.

 

J'ai une classe Activite qui sert à enregistrer une activité pour un employé donné à un moment donné (dans le but ensuite de gérer des emplois du temps pour chaque employé).

 
Code :
  1. include ("./Date.php" );
  2. class Activite
  3. {
  4. private $id;
  5. private $type;
  6. private $titre;
  7. private $debut;
  8. private $fin;
  9. private $employe;
  10. private $description;
  11. /* fonctions membres */
  12. }
 

Tous ces attributs sont soit des entiers, soit des chaînes de caractère...à l'exception de $debut et $fin, qui sont de type Date (j'ai créé par ailleurs une classe date). Une date est de la forme aaaa-mm-jj hh:mm:ss (chaque partie est un entier).

 

Dans me classe Date j'ai défini entre autres une fonction charger_date($id,$debutfin) qui sert à charger la date de début ou de fin pour l'activité qui a l'id $id à partir de la base de données.

 

Pour une fonction membre de Activité, je dois afficher le début et la fin de l'activité donnée. Avant de les afficher, je dois donc charger début et fin (qui sont des dates) depuis la bdd. Je fais donc:

 


Code :
  1. $this->debut->charger_date($this->employe,debut);
  2. $this->fin ->charger_date($this->employe,fin);
 


Et là, c'est le drame:  je me tappe une erreur:

Fatal error: Call to a member function charger_date() on a non-object in V:\Users\Public\www\Activite.php on line 439

 

Je pense comprendre par là que PHP ignore que $this->debut et $this->fin sont de type date (après tout, on ne l'a précisé nulle part). Et je ne sais pas comment faire pour débloquer la situation. Si quelqu'un sait m'aider, je suis preneur.

 

P.S.: notez que je suis vraiment débutant dans le domaine (je veux dire le PHP, l'objet en général je connais un peu plus, j'ai fait un peu de Java), et que donc quelque chose qui est évident pour vous ne le sera pas forcément pour moi. Essayez de détailler un maximum, donc.

 

merci.


Message édité par Misssardonik le 15-03-2007 à 18:13:37

---------------
Que va-t-il se passer cette gelgamar ? vous le découvrirez janamont à 20h
mood
Publicité
Posté le 15-03-2007 à 18:13:13  profilanswer
 

n°1529029
dwogsi
Défaillance cérébrale...
Posté le 15-03-2007 à 18:17:26  profilanswer
 

Dans le constructeur de ta classe Activite tu fait bien quelque chose comme ça :

Code :
  1. $this->debut = new ClassDate();


?


Message édité par dwogsi le 15-03-2007 à 18:17:56

---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/
n°1529069
Misssardon​ik
prévisible a posteriori
Posté le 15-03-2007 à 19:21:09  profilanswer
 

Ah.

 

Je me disais bien que j'avais oublié un truc, çe truc devait être ça. J'essaierai de rajouter ça.

 

Merci :o


Message édité par Misssardonik le 15-03-2007 à 19:21:23

---------------
Que va-t-il se passer cette gelgamar ? vous le découvrirez janamont à 20h
n°1529349
Misssardon​ik
prévisible a posteriori
Posté le 16-03-2007 à 09:58:36  profilanswer
 

Bon, en fait ça ne fonctionne toujours pas.
 
Dans mon constructeur de la classe Date Activite j'ai ajouté:
 
 
 $this->debut = New Date();
 $this->fin = New Date();
 
 
Mais j'ai toujours la même erreur au même endroit :(


Message édité par Misssardonik le 16-03-2007 à 10:22:45

---------------
Que va-t-il se passer cette gelgamar ? vous le découvrirez janamont à 20h
n°1529351
anapajari
s/travail/glanding on hfr/gs;
Posté le 16-03-2007 à 10:00:54  profilanswer
 

euh c'est dans le constructeur de la classe Activite qu'il fallait le rajouter :o

n°1529363
Misssardon​ik
prévisible a posteriori
Posté le 16-03-2007 à 10:22:21  profilanswer
 

Euh oui pardon, c'est bien dans Activite que je l'ai mis.


---------------
Que va-t-il se passer cette gelgamar ? vous le découvrirez janamont à 20h
n°1529400
skeye
Posté le 16-03-2007 à 11:26:36  profilanswer
 

tu as bien ajouté un include du fichier définissant ta classe date?:o


---------------
Can't buy what I want because it's free -
n°1529409
Misssardon​ik
prévisible a posteriori
Posté le 16-03-2007 à 11:46:34  profilanswer
 

J'ai bien fait un :
 

Code :
  1. include ("./Date.php" );


 
dans ma classe Activite, oui.


Message édité par Misssardonik le 16-03-2007 à 11:47:19

---------------
Que va-t-il se passer cette gelgamar ? vous le découvrirez janamont à 20h
n°1529411
skeye
Posté le 16-03-2007 à 11:49:55  profilanswer
 

Tu peux montrer le code de tes deux classes (les parties intéressantes, juste - déclarations des membres, constructeurs, ce qui te sort l'erreur)?


Message édité par skeye le 16-03-2007 à 11:50:15

---------------
Can't buy what I want because it's free -
n°1529432
Misssardon​ik
prévisible a posteriori
Posté le 16-03-2007 à 12:13:57  profilanswer
 

Bon...
 
Classe Date:
 

Code :
  1. /* blabla connexion à la bdd */
  2. class Date
  3. {
  4. private $annee;
  5. private $mois;
  6. private $jour;
  7. private $heure;
  8. private $minute;
  9. private $seconde;
  10. function __construct()
  11. {
  12. $this->annee = 2000;
  13. $this->mois  = 1;
  14. $this->jour  = 1;
  15. $this->heure = 0;
  16. $this->minute = 0;
  17. $this->seconde = 0;
  18. }
  19. function charger_date($id,$debutfin) // $debutfin est égal à 'debut' ou 'fin'
  20. {
  21. $req = mysql_query("SELECT $debutfin FROM occupation WHERE `id`=$id" );
  22. // la date dans la bdd est de la forme aaaa-mm-jj hh:mm:ss,  
  23. // on la bricole un peu pour pouvoir récupérer chaque partie
  24. $changer = array('§ §','§:§');
  25. while ($data = mysql_fetch_array($req))
  26. {
  27.  $debutfin = $data[$debutfin];
  28.  $debutfin = preg_replace($changer,'-',$debutfin);
  29.  $debutfin = explode('-',$debutfin);
  30.  $this->annee = $debutfin[0];
  31.  $this->mois  = $debutfin[1];
  32.  $this->jour  = $debutfin[2];
  33.  $this->heure = $debutfin[3];
  34.  $this->minute = $debutfin[4];
  35.  $this->seconde = $debutfin[5];
  36. }
  37. }
  38. }


 
 
Classe Activite:
 

Code :
  1. /* blabla connexion à la bdd */
  2. include ("./Date.php" );
  3. class Activite
  4. {
  5. private $id;
  6. private $type;
  7. private $titre;
  8. private $debut;  // de type Date, pose problème
  9. private $fin;    // de type Date, pose problème
  10. private $employe;
  11. private $description;
  12. function __construct()
  13. {
  14. $this->debut = New Date();
  15. $this->fin = New Date();
  16. $this->id = -1;
  17. }
  18. function afficher()
  19. {
  20. // c'est sur les deux lignes suivantes que ça bloque:
  21. $this->debut  ->charger_date($this->employe,debut);
  22. $this->fin ->charger_date($this->employe,fin);
  23. /* blabla html pour afficher l'activité sous forme de tableau */
  24. }
  25. }


---------------
Que va-t-il se passer cette gelgamar ? vous le découvrirez janamont à 20h
mood
Publicité
Posté le 16-03-2007 à 12:13:57  profilanswer
 

n°1529453
skeye
Posté le 16-03-2007 à 13:04:05  profilanswer
 

dans afficher, fais un print_r($this->debut), pour voir?


---------------
Can't buy what I want because it's free -
n°1529454
PunkRod
Digital Mohawk
Posté le 16-03-2007 à 13:06:37  profilanswer
 

J'suis pas sur de moi mais j'ai un doute : 'date' ne serait pas considéré comme une commande php protégée ?
essaie de renommer ta classe date, ex :
class ma_date { blabla }
$this->debut = new ma_date();

n°1529539
Misssardon​ik
prévisible a posteriori
Posté le 16-03-2007 à 14:49:38  profilanswer
 

skeye a écrit :

dans afficher, fais un print_r($this->debut), pour voir?

 

Ca ne fait rien du tout...

 

Par contre quand (dans un autre fichier) je fais

 
Code :
  1. $activite_courante = New Activite;
  2. $activite_courante -> charger_activite(3);
  3. echo $activite_courante->get('debut');
 

Là le début de l'activité n°3 est bien affiché (j'ai défini la methode __toString() dans Date, bien sûr).

  


PunkRod a écrit :

J'suis pas sur de moi mais j'ai un doute : 'date' ne serait pas considéré comme une commande php protégée ?

 

Ca ne change rien non plus...

Message cité 1 fois
Message édité par Misssardonik le 16-03-2007 à 14:49:49

---------------
Que va-t-il se passer cette gelgamar ? vous le découvrirez janamont à 20h
n°1529540
skeye
Posté le 16-03-2007 à 14:50:27  profilanswer
 

Misssardonik a écrit :

Ca ne fait rien du tout...


hein?[:pingouino]
Il t'affiche forcément un truc...:o


---------------
Can't buy what I want because it's free -
n°1529560
Misssardon​ik
prévisible a posteriori
Posté le 16-03-2007 à 15:04:45  profilanswer
 

skeye a écrit :

hein?[:pingouino]
Il t'affiche forcément un truc...:o

 

Bah non, je trouve ça bizarre aussi, mais non.

 

Si je fais, pour être sûr (dans la fonction afficher() ):

 
Code :
  1. echo 'print_r fait juste en dessous: <br>';
  2. print_r($this->debut);
  3. echo 'print_r fait juste au dessus. On est dans la fonction afficher.';
 

Bah ça me fait:

 

print_r fait juste en dessous:
print_r fait juste au dessus. On est dans la fonction afficher.

 

Et rien entre les deux. J'ai peut-être oublié un truc, mais là je sèche.


Message édité par Misssardonik le 16-03-2007 à 15:07:29

---------------
Que va-t-il se passer cette gelgamar ? vous le découvrirez janamont à 20h
n°1529566
skeye
Posté le 16-03-2007 à 15:07:34  profilanswer
 

Ton $this->debut n'existe pas à ce moment là, donc.[:petrus75]
Tu es sûr de passer dans le constructeur?[:autobot]


---------------
Can't buy what I want because it's free -
n°1529584
rufo
Pas me confondre avec Lycos!
Posté le 16-03-2007 à 15:24:19  profilanswer
 

c'est en php4 ou php5? Je dirais php4 vu que le constructeur est déclaré comme ça : __construct()
Je demande ça car y'a des petites différences avec l'utilisation du new (en tout cas, c'est ce que j'ai vu sur le site de php
en php 4 : $obj = new MaClasse;
en php 5 : $obj = new MaClasse();
Cela dit, comme php est assez permissif, les 2 syntaxes marchent peut-être toutes les 2
 
ps : c'est une tentative pour trouver une explication au fait que le constructeur ne serait peut-être pas appelé...


Message édité par rufo le 16-03-2007 à 15:24:41
n°1529587
skeye
Posté le 16-03-2007 à 15:28:41  profilanswer
 

ah non __construct c'est php5.:o


---------------
Can't buy what I want because it's free -
n°1529593
rufo
Pas me confondre avec Lycos!
Posté le 16-03-2007 à 15:39:09  profilanswer
 

skeye a écrit :

ah non __construct c'est php5.:o


 
heu, oui, oops,je me suis mélangé les pinceaux :whistle:  

n°1529597
skeye
Posté le 16-03-2007 à 15:44:41  profilanswer
 

mais si le serveur est en php4 ça expliquerait qu'il passe pas dedans...:D


---------------
Can't buy what I want because it's free -
n°1529602
rufo
Pas me confondre avec Lycos!
Posté le 16-03-2007 à 15:50:19  profilanswer
 

faut faire gaffe aussi au mode "compatible php4". En php5, vaut mieux le désactiver (zend.ze1_compatibility_mode à off). Moi, j'ai eu des pb avec ce truc...

n°1529607
skeye
Posté le 16-03-2007 à 15:57:52  profilanswer
 

Jamais eu de pb, perso. Et heureusement, parce-que j'ai encore de vieux bouts de php4 qui trainent et dont j'ai pas le temps de me débarrasser.:o


---------------
Can't buy what I want because it's free -
n°1529618
Misssardon​ik
prévisible a posteriori
Posté le 16-03-2007 à 16:18:03  profilanswer
 

Bon.

 

Dans un fichier de test, je fais:

 
Code :
  1. $activite_courante = New Activite();
  2. $activite_courante -> charger_activite(1);
  3. print_r($activite_courante->get('debut'));
  4. $activite_courante -> afficher();
 

avec, dans la fonction afficher() de la classe Activite:

 
Code :
  1. function afficher()
  2. {
  3.      echo 'print_r fait juste en dessous: <br>';
  4.      print_r($this->debut);
  5.      echo 'print_r fait juste au dessus. On est dans la fonction afficher.';
  6. $this->debut->charger_date($this->employe,debut);
  7. $this->fin ->charger_date($this->employe,fin);
 


ça me renvoit:

 

Date Object ( [annee:private] => 2007 [mois:private] => 03 [jour:private] => 13 [heure:private] => 19 [minute:private] => 00 [seconde:private] => 00 ) print_r fait juste en dessous:
print_r fait juste au dessus. On est dans la fonction afficher.
Fatal error: Call to a member function charger_date() on a non-object in V:\Users\Public\www\Activite.php on line 510

  

Donc le premier print_r (celui avant l'appel de la fonciton afficher()) passe bien, ce qui veut dire que l'objet a bien été créé. Par contre le print_r qui est dans la fonciton afficher() ne passe pas.

 


Message édité par Misssardonik le 16-03-2007 à 16:20:37

---------------
Que va-t-il se passer cette gelgamar ? vous le découvrirez janamont à 20h
n°1529625
skeye
Posté le 16-03-2007 à 16:28:40  profilanswer
 

et ta fonction get() elle fait quoi exactement? il n'y a vraiment rien entre?


---------------
Can't buy what I want because it's free -
n°1529628
Misssardon​ik
prévisible a posteriori
Posté le 16-03-2007 à 16:33:52  profilanswer
 

Ma fonction get de la classe Activite:
 

Code :
  1. function get($attribut)
  2. {
  3. return $this->$attribut;
  4. }


 
Vraiment simple, donc.
 
Et entre get et l'appel à afficher, non il n'y a vraiment rien, ce sont deux lignes consécutives.


---------------
Que va-t-il se passer cette gelgamar ? vous le découvrirez janamont à 20h
n°1529634
skeye
Posté le 16-03-2007 à 16:36:49  profilanswer
 

Je vais faire l'idiot, mais si tu fais un print_r($this->get('debut')) à la place?[:joce]


---------------
Can't buy what I want because it's free -
n°1529635
anapajari
s/travail/glanding on hfr/gs;
Posté le 16-03-2007 à 16:37:11  profilanswer
 

s'koi ce debut qui traine tout seul dans ton charger_date? Manque pas des quotes la?
edit: d'ailleurs il vaut quoi ton $this->employe lors de l'appel???

 

Et pis ça t'arrechera de mettre tes fonctions en private/public/protected histoire que tout soit bien clair? Je sais que PHP est permissif mais la s'vraiment pas bo :o

Message cité 1 fois
Message édité par anapajari le 16-03-2007 à 16:39:14
n°1529650
Misssardon​ik
prévisible a posteriori
Posté le 16-03-2007 à 17:21:22  profilanswer
 

skeye a écrit :

Je vais faire l'idiot, mais si tu fais un print_r($this->get('debut')) à la place?[:joce]

 

Je ne vois pas où tu veux en venir, tu veux dire quoi ? si je remplace

Code :
  1. function get($attribut)
  2. {
  3. return $this->$attribut;
  4. }
 

par

 
Code :
  1. function get($attribut)
  2. {
  3. print_r($this->get('debut'))
  4. }
 

Si c'est ça, alors oui c'est idiot: ça plante le service web.

 


anapajari a écrit :

s'koi ce debut qui traine tout seul dans ton charger_date? Manque pas des quotes la?

 

Je ne vois pas de quoi tu parles, tu veux préciser ?

 

EDIT: Ah oui exact, il semble manquer des quotes. Bon bah je les ai rajoutées, ça change rien :?

 
anapajari a écrit :


edit: d'ailleurs il vaut quoi ton $this->employe lors de l'appel???

 

Il vaut l'id de l'employé concerné par l'activité, mais maintenant que tu le dis je ne vois pas bien pourquoi j'ai mis ça...bon, je mets $this->id à la place (comme ça on charge les dates de début et de fin pour l'activité concernée), ça me semble plus logique. Mais en attendant, ça ne fonctionne toujours pas.

 
anapajari a écrit :


Et pis ça t'arrechera de mettre tes fonctions en private/public/protected histoire que tout soit bien clair? Je sais que PHP est permissif mais la s'vraiment pas bo :o

 

Je prends note  :jap:

Message cité 1 fois
Message édité par Misssardonik le 16-03-2007 à 17:27:20

---------------
Que va-t-il se passer cette gelgamar ? vous le découvrirez janamont à 20h
n°1529652
skeye
Posté le 16-03-2007 à 17:29:16  profilanswer
 

Misssardonik a écrit :

Je ne vois pas où tu veux en venir, tu veux dire quoi ? si je remplace  

Code :
  1. function get($attribut)
  2. {
  3. return $this->$attribut;
  4. }


 
par  
 

Code :
  1. function get($attribut)
  2. {
  3. print_r($this->get('debut'))
  4. }




Effectivement ça ce serait très stupide.:D
Non, je voulais dire dans ta fonction afficher.


---------------
Can't buy what I want because it's free -
n°1529655
Misssardon​ik
prévisible a posteriori
Posté le 16-03-2007 à 17:34:30  profilanswer
 

Ah, oui d'accord.
 
Eh bien là ça affiche les mêmes informations que quand je fais le print_r avant l'appel de la fonction.


---------------
Que va-t-il se passer cette gelgamar ? vous le découvrirez janamont à 20h
n°1529656
rufo
Pas me confondre avec Lycos!
Posté le 16-03-2007 à 17:34:49  profilanswer
 

ben oui, là, ça boucle :whistle:  get() qui appelle get() qui appelle get() qui...

n°1529657
skeye
Posté le 16-03-2007 à 17:39:10  profilanswer
 

Misssardonik a écrit :

Ah, oui d'accord.
 
Eh bien là ça affiche les mêmes informations que quand je fais le print_r avant l'appel de la fonction.


donc $this->'debut' est différent de $this->debut.
Tu initialises lequel?[:joce]


---------------
Can't buy what I want because it's free -
n°1529662
Misssardon​ik
prévisible a posteriori
Posté le 16-03-2007 à 18:02:00  profilanswer
 

Eh bien, l'attribut de Activite s'appelle bien $debut
 
constructeur de Activite:
 

Code :
  1. function __construct()
  2. {
  3. $this->debut = New Date();
  4. $this->fin = New Date();
  5. $this->id = -1;
  6. }


---------------
Que va-t-il se passer cette gelgamar ? vous le découvrirez janamont à 20h
n°1529664
skeye
Posté le 16-03-2007 à 18:03:48  profilanswer
 

Bon, ya une feinte quelque part, là, quand même...tu ne fais pas une modif quelque part en utilisant ton get(), là?:o


---------------
Can't buy what I want because it's free -
n°1530353
Misssardon​ik
prévisible a posteriori
Posté le 19-03-2007 à 10:02:34  profilanswer
 

Bon, reprise des hostilités...
 
 

skeye a écrit :

Bon, ya une feinte quelque part, là, quand même...tu ne fais pas une modif quelque part en utilisant ton get(), là?:o


 
 
Que veux tu dire ? le get() se contente de renvoyer l'attribut demandé, qu'est ce que ça pourrait bien modifier ?


---------------
Que va-t-il se passer cette gelgamar ? vous le découvrirez janamont à 20h
n°1530355
skeye
Posté le 19-03-2007 à 10:05:25  profilanswer
 

Le fait d'utiliser une chaine passée en paramètre pour le nom de l'attribut à renvoyer fout la merde, amha.
Sinon print_r($this->get('debut')) renverrait la même chose que print_r($this->debut).
Donc si tu fais des modifs quelque part en utilisant ce que te retourne la fonction get(), tu as un soucis.:o


---------------
Can't buy what I want because it's free -
n°1530361
Misssardon​ik
prévisible a posteriori
Posté le 19-03-2007 à 10:23:45  profilanswer
 

Allons bon. Et comment je pourrais faire autrement qu'avec une chaine ?


---------------
Que va-t-il se passer cette gelgamar ? vous le découvrirez janamont à 20h
n°1530367
skeye
Posté le 19-03-2007 à 10:30:45  profilanswer
 

Je ne sais pas si php prévoit qu'on puisse accéder à un membre d'une classe via une variable, tout bêtement.:o
En tout cas perso je ne le ferais pas.
Essaye en faisant une fonction getDebut(), pour voir ce que tu obtiens...tu utiliserais pas par hasard une fonction set($attribut) sur le même modèle que ton get() actuellement?


---------------
Can't buy what I want because it's free -
n°1530371
Misssardon​ik
prévisible a posteriori
Posté le 19-03-2007 à 10:37:56  profilanswer
 

Pour modifier un truc j'utilise une fonction modifier($attribut, $valeur) qui donne $valeur à $attribut (après quelques vérifications).

 

Mais en fait ce que tu suggères c'est de faire une fonction différente pour modifier chaque attribut ? ça m'a l'air super pas pratique  [:mouais]

 

Enfin bon, je vais quand même essayer.


Message édité par Misssardonik le 19-03-2007 à 10:38:07

---------------
Que va-t-il se passer cette gelgamar ? vous le découvrirez janamont à 20h
n°1530373
skeye
Posté le 19-03-2007 à 10:39:12  profilanswer
 

Oui, c'est ce que je suggère, et qui se fait dans tous les langages "normaux" de ma connaissance.[:joce]


---------------
Can't buy what I want because it's free -
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Des objets en attributs de classe.

 

Sujets relatifs
[AS] Problème tout bête de classe/AttachMovie[C++] STL - list : doit contenir uniquement des objets dynamiques ??
Au secours! VB6 : Création dynamique d'objets dans datareportinclusion de fichiers de classe ayant le meme nom
[C++] Classe génériques et pointeur (Dev cpp)Récuper les noms des variables correspondant à des objets
[résolu] Probleme d'appel d'un objet dans ma classetableau a deux dimensions d'objets
typer paramètres d'une méthode de classe 
Plus de sujets relatifs à : Des objets en attributs de classe.


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR