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 dans la définition et l'instanciation d'un objet!


Sujet :

Langage PHP

  1. #1
    Membre éclairé Avatar de tigunn
    Homme Profil pro
    Développeur de bug
    Inscrit en
    Janvier 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de bug

    Informations forums :
    Inscription : Janvier 2003
    Messages : 608
    Points : 658
    Points
    658
    Par défaut [POO] Problème dans la définition et l'instanciation d'un objet!
    Salut a tou(te)s !!
    Voila je suis nouveau sous php 5 (POO ^^) et j'ai un petit souci dans l'instanciation d'une classe User.
    Dans User.class.php:
    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
     
     class User 
     {
        public $k_User;
        public $ke_client;
    	public function getUserData($id_user)
    	{
    		//definition
    		global $db;
    		// recupere les données sur l'utilisateur et définition des attributs de l'User
    		$sql = 'SELECT k_user, ...
    					FROM User 
    					WHERE k_user = :id_user';
    		$statement = $db->prepare($sql);
    		$statement->execute(array(":id_user" => $id_user));
    		$tabl_results = $statement->fetch(PDO::FETCH_BOTH);
    $this->k_user=$tabl_results['k_user'];
    		$this->ke_client=$tabl_results['ke_client'];
    		}
    dans action.php:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //creation des objets
    				$user = new User();
    				$user->getUserData($id_user);
    				echo 'son nom est :'.$user->nom;
    Pourriez vous m'aider ?
    Le monde se divise en deux: ceux qui utilisent le tag et les autres.

  2. #2
    Membre confirmé Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Points : 514
    Points
    514
    Par défaut
    $user->getUserData($id_user);

    En php c'est '->' pour accéder aux membres et non '.'

    Edit: tu as modifié le code entre temps ; )

  3. #3
    Membre éclairé Avatar de tigunn
    Homme Profil pro
    Développeur de bug
    Inscrit en
    Janvier 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de bug

    Informations forums :
    Inscription : Janvier 2003
    Messages : 608
    Points : 658
    Points
    658
    Par défaut
    oui
    je me disais c'est peut etre la declaration?
    Le monde se divise en deux: ceux qui utilisent le tag et les autres.

  4. #4
    Membre confirmé Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Points : 514
    Points
    514
    Par défaut
    Tu modifies le code en permanence ; )

    A part ça, c'est quoi le problème ?

    $user->nom ?

    C'est plutot $user->k_User que tu veux ?

  5. #5
    Membre éclairé Avatar de tigunn
    Homme Profil pro
    Développeur de bug
    Inscrit en
    Janvier 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de bug

    Informations forums :
    Inscription : Janvier 2003
    Messages : 608
    Points : 658
    Points
    658
    Par défaut
    je souhaite créer un objet User (avec nom, k_user, ...)
    et je voudrais voir que mon objet est bien crée en appelant un de ses attributs dans action.php.
    j'arrete d'editer mon code
    Le monde se divise en deux: ceux qui utilisent le tag et les autres.

  6. #6
    Membre confirmé Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Points : 514
    Points
    514
    Par défaut
    heu... je ne vois pas où est le problème ?

    Dans action.php, tu include() le fichiers où est déclaré la classe User et tu testes

  7. #7
    Membre actif
    Profil pro
    Développeur Web
    Inscrit en
    Septembre 2006
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2006
    Messages : 215
    Points : 256
    Points
    256
    Par défaut
    Salut

    hum, tu fais appel à un attribut qui n'a pas l'air d'exister.
    de plus dans l'orienté objet, et depuis PHP5 ont à la visibilité des attributs et méthodes, et donc, on ne mets jamais d'attribut en public, il faut passer par des "getter" ou "setter" pour modifier les attributs (concept important de OOP)

    Voila un exemple de classe en PHP5 si ca peut d'aider un tit peu ( ;

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    <?php
    class User 
    {
    	private $k_User;
    	private $ke_client;
     
    	private $_db;
     
    	public function __construct ($db) {
    		$this->_db = $db; // evite de faire appel à une global.
    	}
     
    	// setter !
    	// sert à remplire tes attributs
    	public function setUserData ($id_user)
    	{
    		// recupere les données sur l'utilisateur et définition des attributs de l'User
    		$sql = 'SELECT k_user, ...
    		FROM User 
    		WHERE k_user = :id_user';
    		$statement = $this->_db->prepare($sql); // tu recuperes ton attribut db
    		$statement->execute(array(":id_user" => $id_user));
    		$tabl_results = $statement->fetch(PDO::FETCH_BOTH);
     
    		// tu boss avec PDO, peut etre il serrait judicieux de retourner un tableau
    		// avec k_user et ke_client.
    		//
    		// si tu as besoin de bosser comme ca, alors tu doi utiliser
    		// des getters
    		$this->k_user=$tabl_results['k_user'];
    		$this->ke_client=$tabl_results['ke_client'];
    	}
     
    	// getter
    	public function get_k_User () {
    		return $this->k_User;
    	}
    	public function get_ke_client () {
    		return $this->ke_client;
    	}
    }
     
    // ensuite tu declare l'objet ainsi
    $o = new User ($dbh);
    $o->setUserData ($id);
     
    echo $o->get_k_User ();
    echo $o->get_ke_client ();
    edit : arf, pendant que j'etais en train d'écrire un roman vous avez répondu !, vous déconnez les gars ( ;

    sahid

  8. #8
    Membre éclairé Avatar de tigunn
    Homme Profil pro
    Développeur de bug
    Inscrit en
    Janvier 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de bug

    Informations forums :
    Inscription : Janvier 2003
    Messages : 608
    Points : 658
    Points
    658
    Par défaut
    ALors j'ai fait exactement comme l'exemple de sahid (au point ou elle en est cette classe ca pose pas de pb).
    MAIS ca ne change pas: mon bout de code dans action.php qui crée l'objet et affiche ou appel un attribut, une méthode ne retourne rien, même pas d'erreurs!?
    fatigué pour ce soir je reprend demain.
    Le monde se divise en deux: ceux qui utilisent le tag et les autres.

  9. #9
    Membre actif
    Profil pro
    Développeur Web
    Inscrit en
    Septembre 2006
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2006
    Messages : 215
    Points : 256
    Points
    256
    Par défaut
    arf,

    tu es sur que PDO retourne quelque chose ??
    entoure le de try catch, afin d'attraper les exceptions générées

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $sql = 'SELECT k_user, ...
    		FROM User 
    		WHERE k_user = :id_user';
        try {
    		$statement = $this->_db->prepare($sql); // tu recuperes ton attribut db
    		$statement->execute(array(":id_user" => $id_user));
    		$tabl_results = $statement->fetch(PDO::FETCH_BOTH)
        } catch (PDOException $e) {
            echo $e->getMessage ()
            die ();
        }
    sahid

  10. #10
    Membre éclairé Avatar de tigunn
    Homme Profil pro
    Développeur de bug
    Inscrit en
    Janvier 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de bug

    Informations forums :
    Inscription : Janvier 2003
    Messages : 608
    Points : 658
    Points
    658
    Par défaut
    Ce matin j'ai fait quelques test simple:
    dans User.class.php
    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
    		// TESTS
    		try
    		{
    		$statement->execute(array(":id_user" => $id_user));
    		$tabl_results = $statement->fetch(PDO::FETCH_BOTH);	
    		$current_user = $tabl_results;
    		echo $current_user['k_user'];   // n'affiche rien
    		/*   // n'affiche rien non plus
    		echo '<pre>';
    		print_r($tabl_results);*/
    		}
    		catch(PDOException $e)
    		{
                            // ne rentre pas dans le catch
    			echo $e->getMessage ();
    			die ();
    		}
    		// fin de TESTS
    et aussi dans action.php la page où je crée l'instance de User et où j'appelle la méthode setUserData() (comme définit par Sahid):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //creation des objets
    $user = new User($db);
    $user->setUserData($id_user);
    // TESTS
    echo '<pre>';
    print_r($user);  // tous les attributs sont null !!!
    echo 'son nom est :'. $user->get_nom_User();// n'affiche rien
    Faut-il utiliser serailize()? un defaut dans les definitions?

    PLEASE HELP !!
    Le monde se divise en deux: ceux qui utilisent le tag et les autres.

  11. #11
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par sahid
    de plus dans l'orienté objet, et depuis PHP5 ont à la visibilité des attributs et méthodes, et donc, on ne mets jamais d'attribut en public, il faut passer par des "getter" ou "setter" pour modifier les attributs (concept important de OOP)
    Ne jamais dire jamais.

    Je trouve que l'on abuse un peu des getters et des setters. Dans ce cas précis, le setter est clairement indiqué, puisqu'il y a traitement et modifications pour alimenter les propriétés. D'où la portée "private" pour les propriétés, et donc un getter qui va bien.

    Mais certaines propriétés qui ne sont ni vérifiées, ni calculées, je trouve que les get/set sont complètement inutiles. L'objet, c'est bien, c'est beau. Et des fois c'est abusé...

    Oui, je suis hors sujet, je sors...
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  12. #12
    Membre éclairé Avatar de tigunn
    Homme Profil pro
    Développeur de bug
    Inscrit en
    Janvier 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de bug

    Informations forums :
    Inscription : Janvier 2003
    Messages : 608
    Points : 658
    Points
    658
    Par défaut
    Oui, je suis hors sujet, je sors...
    C'est sympa, mais j'esperais une réponse, une piste, que dij n'importe quoi pour m'aider !!!!
    Je veux pas ouvrir un débat, je voiudrais juste savoir comment ca se fait que ni mon code ni celui de Sahid ne donne quelque chose !!?
    PS: je suis champion toute categorie en erreurs stupides, alors c'est sûrement ça mais où .... ??????????
    Le monde se divise en deux: ceux qui utilisent le tag et les autres.

  13. #13
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Tu dis que tous les attributs sont nulls ?
    Y compris _db ? => es-tu sûr de ton objet d'accès aux données ?
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U

  14. #14
    Membre éclairé Avatar de tigunn
    Homme Profil pro
    Développeur de bug
    Inscrit en
    Janvier 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de bug

    Informations forums :
    Inscription : Janvier 2003
    Messages : 608
    Points : 658
    Points
    658
    Par défaut

    Ah ben m****!!
    jml94, j'ai retesté à l'instant (j'avais mis ça à l'écart jusqu'a ce soir) ET ça marche:
    quand je fais ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo '<pre>';
    print_r($user);
    dans action.php alors je recupere bien les attributs de User.
    ALORS je me souviens pas avoir touché la classe User ni action.php. En tout cas pas les parties de code qui sont au dessus.
    Quelqu'un voit-il une explication, ou j'ai plus qu'a me trouver une corde avant d'avoir à expliquer pourquoi ca marchait pas?
    Le monde se divise en deux: ceux qui utilisent le tag et les autres.

  15. #15
    Membre confirmé Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Points : 514
    Points
    514
    Par défaut
    ALORS je me souviens pas avoir touché la classe User ni action.php
    Moi aussi ça m'arrive parfois de me retrouver fasse à une situation paranormale de ce genre ; )
    Je me console en me disant que c'est moi qui suis pas normal et je passe à autre chose ; )

  16. #16
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    Citation Envoyé par tigunn
    Salut a tou(te)s !!
    Voila je suis nouveau sous php 5 (POO ^^) et j'ai un petit souci dans l'instanciation d'une classe User.
    Dans User.class.php:
    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
     
     class User 
     {
        public $k_User;
        public $ke_client;
    	public function getUserData($id_user)
    	{
    		//definition
    		global $db;
    		// recupere les données sur l'utilisateur et définition des attributs de l'User
    		$sql = 'SELECT k_user, ...
    					FROM User 
    					WHERE k_user = :id_user';
    		$statement = $db->prepare($sql);
    		$statement->execute(array(":id_user" => $id_user));
    		$tabl_results = $statement->fetch(PDO::FETCH_BOTH);
    $this->k_user=$tabl_results['k_user'];
    		$this->ke_client=$tabl_results['ke_client'];
    		}
    dans action.php:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //creation des objets
    				$user = new User();
    				$user->getUserData($id_user);
    				echo 'son nom est :'.$user->nom;
    Pourriez vous m'aider ?
    Salut,

    Suis je le seul à me demander pourquoi la porpriété nom n'est pas déclarée dans la classe ?
    Ce point primordial mis à part.

    Si à l'avenir tu venais à faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $monUser = new User();
    $monUser->UnePropCommeSaAupif = "n'importe quoi";
    Sache que $monUser ne serait plus de type User, mais stdClass. Point qui peut avoir son importance...

    Tant que j'y suis, ce bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //definition
    global $db;
    Me parait teriblement sale.
    $db n'est pas un type primitif, enfin j'imagine, donc utiulise plutot un singleton.
    Tu est en php5 il te permettra de le faire très efficacement.


    Pour terminer, par rapport au titre du thread, creation d'objet === instanciation d'objet.

    Sur ce,

    bye

  17. #17
    Membre confirmé Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Points : 514
    Points
    514
    Par défaut
    Sache que $monUser ne serait plus de type User, mais stdClass. Point qui peut avoir son importance..
    $monUser resterait du type User et UnePropCommeSaAupif serait ajouté en tant que membre public (sauf si le membre public __set() est défini dans la classe auquel cas c'est lui qui prend la main)

  18. #18
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    Effectivement, autant pour moi.... Il semble que cela ait été changé depuis php 5.0.etdespoussieres.

    Merci pour cette précision.

  19. #19
    Membre éclairé Avatar de tigunn
    Homme Profil pro
    Développeur de bug
    Inscrit en
    Janvier 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de bug

    Informations forums :
    Inscription : Janvier 2003
    Messages : 608
    Points : 658
    Points
    658
    Par défaut

    Bon pour synthetiser:
    @kaymak: 1- le bout de code que tu cite est tronquée, toutes les declarations ça faisait un peu long
    2- la definition en global de $db, je l'ai rempllacée par un passage en argument au constructeur sur les conseils de Sahid
    3- Tu dis "stdClass. Point qui peut avoir son importance..." euh tu peux expliquer?
    4- j'ai modifié le titre du post (pointilleux va.. . )
    @goodpz: je savais déjà pour mon anormalité, mais quand même.
    Je vais pas chercher plus longtemps pour l'instant, mais si je trouve je mettrais la réponse.
    En attendant je met [resolu].
    Le monde se divise en deux: ceux qui utilisent le tag et les autres.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème dans la définition de la feuille => Worksheets %$###
    Par scroutch dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 26/01/2014, 16h17
  2. [AC-2003] Problème dans la définition de la valeur par défaut d'un champ
    Par Manhexter dans le forum VBA Access
    Réponses: 7
    Dernier message: 09/11/2010, 08h23
  3. Problème dans la définition du focus()
    Par pounaid dans le forum VB.NET
    Réponses: 2
    Dernier message: 24/03/2009, 15h34
  4. Réponses: 4
    Dernier message: 13/06/2008, 10h09
  5. [POO] Problème dans un exercice sur l'héritage
    Par FabaCoeur dans le forum C++
    Réponses: 2
    Dernier message: 05/05/2007, 17h09

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