Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
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 30/01/2008, 12h26   #1
Nouveau Membre du Club
 
Avatar de Ministar
 
Inscription : septembre 2006
Messages : 143
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : septembre 2006
Messages : 143
Points : 25
Points : 25
Par défaut [POO] Problème d'appel d'une fonction d'une autre classe

Bonjour!
Je me met à l'objet et j'ai mon premier probleme.

J'ai une classe date :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 
class cl_date
{
//Attributs :
	private $date; // Format datetime
 
//Méthodes :
 
 public function __construct()
  {
	$this->date=Date("Y-m-d H:i:s");
  }
 
//Transmet une valeur datime à l'attribut :
  public function set_Date($date)
  {
  	if($this->VerifDateTime($date)==1)
  	{ 
  	  $this->date=$date;
  	}  	  
  	else
  	{ $this->date=Date("Y-m-d H:i:s"); }
  }
 
 
//On récupère la valeur de l'attribut
public function get_Date()
  {
  	return $this->date;
  }
 
}

Et une classe evenement :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
require_once("./cl_date.php5");
 
class cl_evenement
{
//Attributs :
private $date_evenement; // la variable est de type cl_date
 
 
//Méthodes :
public function __construct()
{
	$this->date_evenement=cl_date::set_Date();	
}
 
public function get_Date_Evenement()
{
	return($this->date_evenement);
}

Mon fichier pour afficher la date_evenement de la classe evenement :

Code :
1
2
3
4
 include("./cl_evenement.php5");
 
 $evenement= new cl_evenement();
 echo "valeur date_evenement : ".$evenement->get_Date_Evenement();
Rien ne s'affiche, ou sont mes erreurs??
Merci!

Edit : ajout du constructeur dans classe cl_date
Ministar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2008, 12h40   #2
Modérateur
 
Avatar de Rakken
 
Inscription : août 2006
Messages : 1 207
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 1 207
Points : 1 137
Points : 1 137
Dans ta classe cl_evenement tu écris ca :
Code :
$this->date_evenement=cl_date::set_Date();
En gros, ca veut dire que tu fais un appel "static" a set_Date, sans instanciation de la classe.
S'il n'y a pas instanciation, alors depuis la fonction appelé (ici set_Date) les variable de la classe ($this->date) ne sont pas accessible. D'ou, probablement, ton problème.

Donc je pense que la solution, c'est, dans cl_evenement de faire un new cl_date et d'appeler avec -> et pas ::

[edit]Hummm... apres relecture, même si je que j'ai dit au dessus reste vrai, un autre problème est que tu n'a pas de return dans set_Date[/edit]
__________________
Rakken

Oneira, un monde imaginaire d'Heroic Fantasy.

Parce que la présomption d'innocence est un des fondements de notre pays et qu'elle doit le rester, dans tous les domaines : http://www.laquadrature.net/
Rakken est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2008, 12h49   #3
Membre éprouvé
 
Développeur Web
Inscription : avril 2005
Messages : 395
Détails du profil
Informations personnelles :
Âge : 28

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2005
Messages : 395
Points : 479
Points : 479
tout d'abord :

Code :
if($this->VerifDateTime($date)==1)

Fatal error: Call to undefined method cl_evenement::VerifDateTime()


tu affiches les erreurs ?
Gats est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2008, 12h52   #4
Membre éclairé
 
Inscription : décembre 2007
Messages : 426
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 426
Points : 313
Points : 313
Je débute aussi en POO, la première remarque de Rakken à l'air bonne, par contre je vois pas pourquoi il faudrais un return.

Je pense que l'héritage aurais été approprié je pense dans ton exemple, tu pourrais faire un truc du style.

Code :
class cl_evenement extends cl_date
Eric93 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2008, 12h57   #5
Membre éclairé
 
Inscription : décembre 2007
Messages : 426
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 426
Points : 313
Points : 313
Et pourquoi dans cl_date tu fait une fonction set_date qui n'est pas constructeur comme dans cl_evenement ?

J'aurais mis set_date en constructeur
Eric93 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2008, 13h00   #6
Membre éclairé
 
Inscription : décembre 2007
Messages : 426
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 426
Points : 313
Points : 313
si dans cldate tu met set_date en constructeur, tu devrais pouvoir faire dans cl_evenement :

Code :
1
2
3
4
public function __construct()
{
	$this->date_evenement = new cl_date();	
}
ou
Code :
1
2
3
4
public function __construct($date)
{
	$this->date_evenement = new cl_date($date);	
}
Eric93 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2008, 13h50   #7
Nouveau Membre du Club
 
Avatar de Ministar
 
Inscription : septembre 2006
Messages : 143
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : septembre 2006
Messages : 143
Points : 25
Points : 25
Vous vous êtes fait plaisir sur mon sujet en peu de temps
Merci de votre aide!

Alors :

Rakken :
pour le :: je n'étais pas du tout sur de moi, j'ai tester beaucoup de chose en essayant de trouver la solution (quand on arrive plus à réfléchir c'est la dernière solution!
Je sais qu'il faut que je déclare mon attribut date_evenement comme étant de type cl_date, j'ai essayé de declarer mon attribut comme ceci mais ca ne marchait pas :
Code :
private $date_evenement= new cl_date();
Gats : Je n'ai pas mis l'intégralité de mes fonction, dans cl_date j'ai une fonction verifDateTime. Ma classe cl_date fonctionne très bien, j'ai fais tous les tests possibles.

Eric93 : En utilisant l'héritage ma variable $date_evenement serait lié à la classe cl_date?

Dans cl_date j'ai déjà un constructeur que je n'ai pas représenté ici il s'appelle __construct() et transmet à l'attribut date de la classe cl_date la date du jour.

La déclaration de ma variable $date_evenement en tant que type cl_date se fait donc avec
Code :
$this->date_evenement = new cl_date();
?

Je test de suite!
Ministar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2008, 14h04   #8
Nouveau Membre du Club
 
Avatar de Ministar
 
Inscription : septembre 2006
Messages : 143
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : septembre 2006
Messages : 143
Points : 25
Points : 25
Par défaut C'est bon :p

Pour ceux qui aurait le même probleme que moi :

Pour déclarer un attribut comme étant un objet :

Code :
$this->attribut = new classe();
Pour moi :

Code :
$this->date_evenement = new cl_date();
Ensuite on utilise l'attribut comme si il s'agissait d'un objet à par entière :
Code :
1
2
 
$this->attribut->fonctionDeLaClasse();
Pour moi :

Code :
1
2
3
4
public function get_Date_Evenement()
{
	return($this->date_evenement->get_Date());
}
Maintenant que j'ai la solution ca me parait super simple, il faut simplement considérer le $this->date_evenement comme l'objet $obj_date_evenement par exemple.

Merci!!!

Petite question en plus : j'étais en train de coder une fonction set_Date_Evenement dans ma classe cl_evenement mais cela est il vraiement utile?
N'est il pas plus simple de passer par : ($objet est un cl_evenement)

$objet->date_evenement->set_Date($newdate);

au lieu de coder ma classe set_Date_Evenement et faire

$objet->set_Date_Evenement($newdate);
Ministar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2008, 14h17   #9
Membre éclairé
 
Inscription : décembre 2007
Messages : 426
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 426
Points : 313
Points : 313
Citation:
En utilisant l'héritage ma variable $date_evenement serait lié à la classe cl_date?
C'est toute ta classe cl_evenement qui serait lié à la classe cl_date.

Tout dépend de ce que tu veux faire.
__________________
Si un problème ne trouve pas de solution, c'est qu'il n'y à pas de problème
Eric93 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2008, 14h25   #10
Nouveau Membre du Club
 
Avatar de Ministar
 
Inscription : septembre 2006
Messages : 143
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : septembre 2006
Messages : 143
Points : 25
Points : 25
Ma classe cl_evenement ne va pas avoir besoin tout le temps de ma classe date, seul 2 de mes attributs vont en avoir besoin.

Après mes propriétés vont être
$titre, $libelle $id_evenement etc
et mes fonction
bdd_MAJ_evenement($titre,$libelle)
bdd_supp_evenement($id) etc

Je vais m'en servir pour interagir avec ma base de données et autres petites choses :p
Ministar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2008, 14h55   #11
Membre éclairé
 
Inscription : décembre 2007
Messages : 426
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 426
Points : 313
Points : 313
Petite idée de simplification :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public function __construct()
  {
	$this->date=Date("Y-m-d H:i:s");
  }
 
public function set_Date($date)
  {
  	if($this->VerifDateTime($date)==1)
  	{ 
  	  $this->date=$date;
  	}  	  
  	else
  	{ $this->date=Date("Y-m-d H:i:s"); }
  }
Equivaut à
Code :
1
2
3
4
5
6
7
8
9
public function __construct($date)
  {
  	if($this->VerifDateTime($date)==1)
  	{ 
  	  $this->date=$date;
  	}  	  
  	else
  	{ $this->date=Date("Y-m-d H:i:s"); }
  }
Si la date n'est pas définie il prend la date du jour
__________________
Si un problème ne trouve pas de solution, c'est qu'il n'y à pas de problème
Eric93 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2008, 15h02   #12
Membre éclairé
 
Inscription : décembre 2007
Messages : 426
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 426
Points : 313
Points : 313
Correction (valeur par defaut pour la date) :
Code :
1
2
3
4
5
6
7
8
9
public function __construct($date = "")
  {
  	if($this->VerifDateTime($date)==1)
  	{ 
  	  $this->date=$date;
  	}  	  
  	else
  	{ $this->date=Date("Y-m-d H:i:s"); }
  }
Ainsi
$date = new cl_date(); //pour la date du jour
$date = new cl_date($d) //pour une date donnée
__________________
Si un problème ne trouve pas de solution, c'est qu'il n'y à pas de problème
Eric93 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2008, 15h13   #13
Modérateur
 
Avatar de Rakken
 
Inscription : août 2006
Messages : 1 207
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 1 207
Points : 1 137
Points : 1 137
Ca ce compte la, je rajouterai une nuance en mettant $date=null en parametre du constructeur.

Code :
1
2
3
4
5
6
7
8
9
public function __construct($date=null)
  {
  	if($this->VerifDateTime($date)==1)
  	{ 
  	  $this->date=$date;
  	}  	  
  	else
  	{ $this->date=Date("Y-m-d H:i:s"); }
  }
En n'oubliant pas de gerer le cas dans VerifDateTime le cas ou la date est nulle.
[edit]Grillé ;-)[/edit]
__________________
Rakken

Oneira, un monde imaginaire d'Heroic Fantasy.

Parce que la présomption d'innocence est un des fondements de notre pays et qu'elle doit le rester, dans tous les domaines : http://www.laquadrature.net/
Rakken est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2008, 15h19   #14
Membre éclairé
 
Inscription : décembre 2007
Messages : 426
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 426
Points : 313
Points : 313
Oui effectivement c'est mieu, pour éviter un appel à VerifDateTime pour rien, il peux aussi mettre
Code :
if($date && $this->VerifDateTime($date)==1)
D'ailleur VerifDateTime devrait renvoyer un booléen afin de faire directement
Code :
if($date && $this->VerifDateTime($date))
__________________
Si un problème ne trouve pas de solution, c'est qu'il n'y à pas de problème
Eric93 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2008, 15h22   #15
Membre éclairé
 
Inscription : décembre 2007
Messages : 426
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 426
Points : 313
Points : 313
Correction, je pense qu'il faut utiliser isset :
Code :
if(isset($date) && $this->VerifDateTime($date))
__________________
Si un problème ne trouve pas de solution, c'est qu'il n'y à pas de problème
Eric93 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2008, 15h26   #16
Nouveau Membre du Club
 
Avatar de Ministar
 
Inscription : septembre 2006
Messages : 143
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : septembre 2006
Messages : 143
Points : 25
Points : 25
Oui, je pense que la solution avec isset devrais fonctionner. Je testerais ca lundi.

Merci de votre aide, étant donné que je commence juste la POO en php autant partir sur de bonne bases ;p
Ministar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2008, 15h27   #17
Membre éclairé
 
Inscription : décembre 2007
Messages : 426
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 426
Points : 313
Points : 313
Après réflexion, c'est mieu de mettre le isset dans VerifDateTime qui devras donc aussi être féfinie comme suit
Code :
1
2
3
VerifDateTime ($date=null) {
...
}
__________________
Si un problème ne trouve pas de solution, c'est qu'il n'y à pas de problème
Eric93 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h13.


 
 
 
 
Partenaires

Hébergement Web