IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[POO] Problème d'appel d'une fonction d'une autre classe


Sujet :

Langage PHP

  1. #1
    Membre du Club Avatar de Ministar
    Inscrit en
    Septembre 2006
    Messages
    143
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2006
    Messages : 143
    Points : 56
    Points
    56
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre expérimenté
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Points : 1 341
    Points
    1 341
    Par défaut
    Dans ta classe cl_evenement tu écris ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $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/

  3. #3
    Membre confirmé
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    397
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 397
    Points : 518
    Points
    518
    Par défaut
    tout d'abord :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if($this->VerifDateTime($date)==1)

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


    tu affiches les erreurs ?
    Zend PHP5 Certification
    MySQL 4 Core Certification

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 424
    Points : 382
    Points
    382
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    class cl_evenement extends cl_date
    Si un problème ne trouve pas de solution, c'est qu'il n'y à pas de problème

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 424
    Points : 382
    Points
    382
    Par défaut
    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
    Si un problème ne trouve pas de solution, c'est qu'il n'y à pas de problème

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 424
    Points : 382
    Points
    382
    Par défaut
    si dans cldate tu met set_date en constructeur, tu devrais pouvoir faire dans cl_evenement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public function __construct()
    {
    	$this->date_evenement = new cl_date();	
    }
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public function __construct($date)
    {
    	$this->date_evenement = new cl_date($date);	
    }
    Si un problème ne trouve pas de solution, c'est qu'il n'y à pas de problème

  7. #7
    Membre du Club Avatar de Ministar
    Inscrit en
    Septembre 2006
    Messages
    143
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2006
    Messages : 143
    Points : 56
    Points
    56
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->date_evenement = new cl_date();
    ?

    Je test de suite!

  8. #8
    Membre du Club Avatar de Ministar
    Inscrit en
    Septembre 2006
    Messages
    143
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2006
    Messages : 143
    Points : 56
    Points
    56
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->attribut = new classe();
    Pour moi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->date_evenement = new cl_date();
    Ensuite on utilise l'attribut comme si il s'agissait d'un objet à par entière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $this->attribut->fonctionDeLaClasse();
    Pour moi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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);

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 424
    Points : 382
    Points
    382
    Par défaut
    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

  10. #10
    Membre du Club Avatar de Ministar
    Inscrit en
    Septembre 2006
    Messages
    143
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2006
    Messages : 143
    Points : 56
    Points
    56
    Par défaut
    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

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 424
    Points : 382
    Points
    382
    Par défaut
    Petite idée de simplification :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 424
    Points : 382
    Points
    382
    Par défaut
    Correction (valeur par defaut pour la date) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  13. #13
    Membre expérimenté
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Points : 1 341
    Points
    1 341
    Par défaut
    Ca ce compte la, je rajouterai une nuance en mettant $date=null en parametre du constructeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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/

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 424
    Points : 382
    Points
    382
    Par défaut
    Oui effectivement c'est mieu, pour éviter un appel à VerifDateTime pour rien, il peux aussi mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if($date && $this->VerifDateTime($date)==1)
    D'ailleur VerifDateTime devrait renvoyer un booléen afin de faire directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if($date && $this->VerifDateTime($date))
    Si un problème ne trouve pas de solution, c'est qu'il n'y à pas de problème

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 424
    Points : 382
    Points
    382
    Par défaut
    Correction, je pense qu'il faut utiliser isset :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  16. #16
    Membre du Club Avatar de Ministar
    Inscrit en
    Septembre 2006
    Messages
    143
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2006
    Messages : 143
    Points : 56
    Points
    56
    Par défaut
    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

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 424
    Points : 382
    Points
    382
    Par défaut
    Après réflexion, c'est mieu de mettre le isset dans VerifDateTime qui devras donc aussi être féfinie comme suit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

Discussions similaires

  1. Appel d'une fonction dans une fonction d'une même classe
    Par script73 dans le forum Général Python
    Réponses: 3
    Dernier message: 06/03/2015, 10h18
  2. Appel d'une fonction dans une fonction (sql server 2005)
    Par catchouse dans le forum Développement
    Réponses: 10
    Dernier message: 06/05/2009, 12h03
  3. getattr() ? Appel d'une fonction depuis une fonction
    Par frites.saucisse dans le forum Général Python
    Réponses: 8
    Dernier message: 10/10/2008, 14h21
  4. Appeler une fonction dans une fonction
    Par bryanstaubin dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 18/06/2007, 09h39
  5. Appel d'une fonction dans une iframe sur un autre domaine
    Par morikann dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 16/06/2007, 18h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo