Des objets en attributs de classe.

Des objets en attributs de classe. - PHP - Programmation

Marsh Posté le 15-03-2007 à 18:13:13    

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
Reply

Marsh Posté le 15-03-2007 à 18:13:13   

Reply

Marsh Posté le 15-03-2007 à 18:17:26    

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})/
Reply

Marsh Posté le 15-03-2007 à 19:21:09    

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
Reply

Marsh Posté le 16-03-2007 à 09:58:36    

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
Reply

Marsh Posté le 16-03-2007 à 10:00:54    

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

Reply

Marsh Posté le 16-03-2007 à 10:22:21    

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
Reply

Marsh Posté le 16-03-2007 à 11:26:36    

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


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 16-03-2007 à 11:46:34    

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
Reply

Marsh Posté le 16-03-2007 à 11:49:55    

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 -
Reply

Marsh Posté le 16-03-2007 à 12:13:57    

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
Reply

Marsh Posté le 16-03-2007 à 12:13:57   

Reply

Marsh Posté le 16-03-2007 à 13:04:05    

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


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 16-03-2007 à 13:06:37    

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();

Reply

Marsh Posté le 16-03-2007 à 14:49:38    

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
Reply

Marsh Posté le 16-03-2007 à 14:50:27    

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 -
Reply

Marsh Posté le 16-03-2007 à 15:04:45    

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
Reply

Marsh Posté le 16-03-2007 à 15:07:34    

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 -
Reply

Marsh Posté le 16-03-2007 à 15:24:19    

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
Reply

Marsh Posté le 16-03-2007 à 15:28:41    

ah non __construct c'est php5.:o


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 16-03-2007 à 15:39:09    

skeye a écrit :

ah non __construct c'est php5.:o


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

Reply

Marsh Posté le 16-03-2007 à 15:44:41    

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 -
Reply

Marsh Posté le 16-03-2007 à 15:50:19    

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...

Reply

Marsh Posté le 16-03-2007 à 15:57:52    

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 -
Reply

Marsh Posté le 16-03-2007 à 16:18:03    

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
Reply

Marsh Posté le 16-03-2007 à 16:28:40    

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 -
Reply

Marsh Posté le 16-03-2007 à 16:33:52    

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
Reply

Marsh Posté le 16-03-2007 à 16:36:49    

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 -
Reply

Marsh Posté le 16-03-2007 à 16:37:11    

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
Reply

Marsh Posté le 16-03-2007 à 17:21:22    

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
Reply

Marsh Posté le 16-03-2007 à 17:29:16    

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 -
Reply

Marsh Posté le 16-03-2007 à 17:34:30    

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
Reply

Marsh Posté le 16-03-2007 à 17:34:49    

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

Reply

Marsh Posté le 16-03-2007 à 17:39:10    

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 -
Reply

Marsh Posté le 16-03-2007 à 18:02:00    

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
Reply

Marsh Posté le 16-03-2007 à 18:03:48    

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 -
Reply

Marsh Posté le 19-03-2007 à 10:02:34    

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
Reply

Marsh Posté le 19-03-2007 à 10:05:25    

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 -
Reply

Marsh Posté le 19-03-2007 à 10:23:45    

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
Reply

Marsh Posté le 19-03-2007 à 10:30:45    

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 -
Reply

Marsh Posté le 19-03-2007 à 10:37:56    

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
Reply

Marsh Posté le 19-03-2007 à 10:39:12    

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 -
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed