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] Call to a member function on a non-object


Sujet :

Langage PHP

  1. #1
    Membre habitué Avatar de Roromix
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 182
    Points : 139
    Points
    139
    Par défaut [POO] Call to a member function on a non-object
    Voila, j'ai ce message d'erreur dans ma classe Panier et j'aimerai corrigé ce bug : Fatal error: Call to a member function on a non-object in /mnt/am2/07/812/00000020/htdocs/test/panier/panier.class.php on line 162

    La ligne concernée est en jaune.

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    <?php
    // *******************************************************
    // Classe de panier basique utilisant les sessions
    // Elle nécessite la classe Produit pour etre utilisée
    // *******************************************************
    
    // le constructeur : créé une session panier
    // si elle n'existe pas encore
    // le contenu pointe sur le tableau de la session
    class Auto_Panier extends Panier {
      function Auto_Panier() {
        @session_start();
        if (!isset($_SESSION['Panier']))
          $_SESSION['Panier']=array();
          $this->contenu = $_SESSION['Panier'];
      }
    }
    
    // des constantes pour les messages d'erreur
    define("ERR1","Le produit n'a pas été trouvé dans le panier.");
    define("ERR2","Méthode de recherche inconnue");
    
    class Panier {
    
    	// les propriétés du produit
    	// accessibles uniquement dans la classe
    	var $contenu;
    	var $total;
    	var $quantite;
    	var $poidstotal;
    
    	// ajoute un produit dans le panier
    	// ou juste une unité s'il existe déjà
    	function ajoute($produit) {
              $pos = $this->getPosById($produit->getId());
              if ($pos >= 0)
                $this->contenu[$pos]->ajouteunite();
    
              else
                $this->contenu[] = $produit;
    
              $this->actualise();
    	}
    
    	// supprime un produit du panier
    	function supprime($id) {
              $pos = $this->getPosById($id);
              if ($pos == -1)
                echo ERR1;
    
              array_splice($this->contenu,$pos,1);
              $this->actualise();
    	}
     
    	// ajoute une unité d'un produit connaissant son id
     	function ajouteunite($idproduit) {
              $pos = $this->getPosById($idproduit);
              if ($pos == -1)
                echo ERR1;
    
              $this->contenu[$pos]->ajouteunite();
              $this->actualise();
    	}
    	
    	// supprime une unité d'un produit avec son id
    	function supprimeunite($idproduit) {
              $pos = $this->getPosById($idproduit);
              if ($pos == -1)
                echo ERR1;
                
              // s'il n'y a plus d'unité, on efface le produit
              if (!$this->contenu[$pos]->supprimeunite())
                $this->supprime($idproduit);
                
              else $this->actualise();
    	}
    	
    
    	// permet de rentrer le nombre d'unité(s) souhaitée(s) 
    	function recalculer($nb) {
              foreach ($nb as $idproduit => $unites) {
                if (is_numeric($unites)) {
                  $pos = $this->getPosById($idproduit);
                  if ($pos == -1)
                    echo ERR1;
    
                  if ($unites == '0')
                    $this->supprime($idproduit);
                    
                  else
                    $this->contenu[$pos]->majunite($unites);
    
                }
              }
              $this->actualise();
    	}
    
    	// vide complètement le panier
    	function vide() {
              $this->contenu = array();
              $this->actualise();
    	}
    	
    	// renvoie le contenu du panier à la position $pos
    	function getContenu($pos) {
              return $this->contenu[$pos];
    	}
    	
    	// renvoie le total HT du panier
    	function getTotal() {
              return round($this->total,2);
    	}
    	
    	// renvoie le total TTC du panier
    	function getTotalTTC() {
              return round($this->total * 1.196,2);
    	}
    	
    	// renvoie le poids total (2 chiffres après la virgule)
    	function getPoidsTotal() {
              return round($this->poidstotal,2);
    	}
    	
    	// renvoie la quantité de produits différents
    	// dans le panier
    	function getquantite() {
              return $this->quantite;
    	}
     
    	// renvoie la position du produit avec son id
    	function getPosById($id) {
              return $this->getPos('Id',$id);
    	}
    	
    	// renvoie la position du produit avec son nom
    	function getPosByNom($nom) {
              return $this->getPos('Nom',$nom);
    	}
    	
    	// renvoie un produit avec un son id
    	function getproduitById($id) {
              $pos = $this->getPos('Id',$id);
              return $this->contenu[$pos]['produit'];
    	}
    	
    	// renvoie un produit d'apres son nom
    	function getproduitByNom($nom) {
              $pos = $this->getPos('Nom',$nom);
              return $this->contenu[$pos]['produit'];
    	}
    	
    	// appelle la méthode de la classe produit
    	// getId ou getNom pour parcourir le tableau
    	// contenu et renvoyer la position de ce produit
    	function getPos($by,$value) {
              if (!in_array($by,array('Id','Nom')))
                echo ERR2;
    
              $pos = -1;
              foreach ($this->contenu as $key => $produit)
                if ($produit->{'get'.$by}() == $value)
                  $pos = $key;
    
              return $pos;
    	}
    	
    	// actualise le panier
    	function actualise() {
              $this->total = 0;
              $this->poidstotal = 0;
              $this->quantite = 0;
              foreach ($this->contenu as $produit) {
                $qte = $produit->getquantite();
                $this->total += $produit->getprixHT() * $qte;
                $this->poidstotal += $produit->getPoids() * $qte;
                $this->quantite += 1;
              }
    	}
    }
    ?>
    Je fonctionne en PHP 4 car mon hébergeur n'a pas l'air d'accepté le php 5

  2. #2
    Membre émérite
    Avatar de yiannis
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 494
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 494
    Points : 2 791
    Points
    2 791
    Par défaut
    Bonjour,

    // *******************************************************
    // Classe de panier basique utilisant les sessions
    // Elle nécessite la classe Produit pour etre utilisée
    // *******************************************************
    ou se trouve cette classe? A mon avis tu dois avoir un fichier produit_class.php qui doit trainer quelque part. Tu fais un include() de ce fichier (la ou est definie ta classe produit) dans ta page et tu n'auras plus cette erreur

  3. #3
    Membre habitué Avatar de Roromix
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 182
    Points : 139
    Points
    139
    Par défaut
    Donc tout dabord j'ai mon index :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    require_once('produit.class.php');
    require_once('panier.class.php');
     
    // Création d'un panier
    $panier = new Auto_Panier();
     
    // Ajout d'un produit pour la démo
     $P2 = new Auto_Produit(2,"Hihihi",0.12,12.0);
     $panier->ajoute($P2);
    Ensuite, dans panier.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
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    <?php
    // *******************************************************
    // Classe de panier basique utilisant les sessions
    // Elle nécessite la classe Produit pour etre utilisée
    // *******************************************************
     
    // le constructeur : créé une session panier
    // si elle n'existe pas encore
    // le contenu pointe sur le tableau de la session
    class Auto_Panier extends Panier {
      function Auto_Panier() {
        @session_start();
        if (!isset($_SESSION['Panier']))
          $_SESSION['Panier']=array();
          $this->contenu = $_SESSION['Panier'];
      }
    }
     
    // des constantes pour les messages d'erreur
    define("ERR1","Le produit n'a pas été trouvé dans le panier.");
    define("ERR2","Méthode de recherche inconnue");
     
    class Panier {
     
    	// les propriétés du produit
    	// accessibles uniquement dans la classe
    	var $contenu;
    	var $total;
    	var $quantite;
    	var $poidstotal;
     
    	// ajoute un produit dans le panier
    	// ou juste une unité s'il existe déjà
    	function ajoute($produit) {
              $pos = $this->getPosById($produit->getId());
              if ($pos >= 0)
                $this->contenu[$pos]->ajouteunite();
     
              else
                $this->contenu[] = $produit;
     
              $this->actualise();
    	}
     
    	// supprime un produit du panier
    	function supprime($id) {
              $pos = $this->getPosById($id);
              if ($pos == -1)
                echo ERR1;
     
              array_splice($this->contenu,$pos,1);
              $this->actualise();
    	}
     
    	// ajoute une unité d'un produit connaissant son id
     	function ajouteunite($idproduit) {
              $pos = $this->getPosById($idproduit);
              if ($pos == -1)
                echo ERR1;
     
              $this->contenu[$pos]->ajouteunite();
              $this->actualise();
    	}
     
    	// supprime une unité d'un produit avec son id
    	function supprimeunite($idproduit) {
              $pos = $this->getPosById($idproduit);
              if ($pos == -1)
                echo ERR1;
     
              // s'il n'y a plus d'unité, on efface le produit
              if (!$this->contenu[$pos]->supprimeunite())
                $this->supprime($idproduit);
     
              else $this->actualise();
    	}
     
     
    	// permet de rentrer le nombre d'unité(s) souhaitée(s) 
    	function recalculer($nb) {
              foreach ($nb as $idproduit => $unites) {
                if (is_numeric($unites)) {
                  $pos = $this->getPosById($idproduit);
                  if ($pos == -1)
                    echo ERR1;
     
                  if ($unites == '0')
                    $this->supprime($idproduit);
     
                  else
                    $this->contenu[$pos]->majunite($unites);
     
                }
              }
              $this->actualise();
    	}
     
    	// vide complètement le panier
    	function vide() {
              $this->contenu = array();
              $this->actualise();
    	}
     
    	// renvoie le contenu du panier à la position $pos
    	function getContenu($pos) {
              return $this->contenu[$pos];
    	}
     
    	// renvoie le total HT du panier
    	function getTotal() {
              return round($this->total,2);
    	}
     
    	// renvoie le total TTC du panier
    	function getTotalTTC() {
              return round($this->total * 1.196,2);
    	}
     
    	// renvoie le poids total (2 chiffres après la virgule)
    	function getPoidsTotal() {
              return round($this->poidstotal,2);
    	}
     
    	// renvoie la quantité de produits différents
    	// dans le panier
    	function getquantite() {
              return $this->quantite;
    	}
     
    	// renvoie la position du produit avec son id
    	function getPosById($id) {
              return $this->getPos('Id',$id);
    	}
     
    	// renvoie la position du produit avec son nom
    	function getPosByNom($nom) {
              return $this->getPos('Nom',$nom);
    	}
     
    	// renvoie un produit avec un son id
    	function getproduitById($id) {
              $pos = $this->getPos('Id',$id);
              return $this->contenu[$pos]['produit'];
    	}
     
    	// renvoie un produit d'apres son nom
    	function getproduitByNom($nom) {
              $pos = $this->getPos('Nom',$nom);
              return $this->contenu[$pos]['produit'];
    	}
     
    	// appelle la méthode de la classe produit
    	// getId ou getNom pour parcourir le tableau
    	// contenu et renvoyer la position de ce produit
    	function getPos($by,$value) {
              if (!in_array($by,array('Id','Nom')))
                echo ERR2;
     
              $pos = -1;
              foreach ($this->contenu as $key => $produit)
                if ($produit->{'get'.$by}() == $value)
                  $pos = $key;
     
              return $pos;
    	}
     
    	// actualise le panier
    	function actualise() {
              $this->total = 0;
              $this->poidstotal = 0;
              $this->quantite = 0;
              foreach ($this->contenu as $produit) {
                $qte = $produit->getquantite();
                $this->total += $produit->getprixHT() * $qte;
                $this->poidstotal += $produit->getPoids() * $qte;
                $this->quantite += 1;
              }
    	}
    }
    ?>
    et dans produit.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
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    <?php
    // *******************************************************
    // Classe de produit utilisée par la classe panier
    // *******************************************************
     
    // le constructeur qui prend quelques infos
    // sur le nouveau produit en paramètre
    class Auto_Produit extends Produit {
      function Auto_Produit ($id,$nom,$prix,$poids,$tva=19.6) {
        $this->id = $id;
        $this->nom = $nom;
        $this->prix = $prix;
        $this->poids = $poids;
        $this->quantite = 1;
        $this->tva = ($tva > 1) ? ($tva / 100 + 1) : $tva;
      }
    }
     
    class Produit {
     
    	// les propriétés du produit
    	// accessibles uniquement dans la classe
    	var $id;
    	var $nom;
    	var $prix;
    	var $quantite;
    	var $tva;
    	var $poids;
     
    	// ajoute une unité du produit pour le panier
    	function ajouteunite() {
              $this->quantite += 1;
    	}
     
    	// supprimer une unité du produit
    	function supprimeunite() {
              $this->quantite -= 1;
              if (!$this->quantite) return false;
              else return true;
    	}
     
    	// mise à jour des unités du produit pour le panier
    	function majunite($unites) {
              $this->quantite = $unites;
    	}
     
    	// renvoie le numéro id unique du produit
    	function getId() {
              return $this->id;
    	}
     
    	// renvoie le nom du produit
    	function getNom() {
              return $this->nom;
    	}
     
    	// renvoie le prix HT (maxi 2 chiffres après la virgule)
    	function getprixHT() {
              return round($this->prix,2);
    	}
     
    	// renvoie le prix TTC (maxi 2 chiffres après la virgule)
    	function getprixTTC() {
              return round($this->prix * $this->tva,2);
    	}
     
    	// renvoie le poids (maxi 2 chiffres après la virgule)
    	function getPoids() {
              return round($this->poids,2);
    	}
     
    	// renvoie le nom d'unité du produit
    	function getquantite() {
              return $this->quantite;
    	}
    }
    ?>
    Voila tout

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Vous pouvez ajouter un test avec is_object($produit) dans le foreach mais pour réellement trouver où se situe le problème il faudrait effectuer un var_dump par exemple sur $this->contenu pour voir qui est l'intrus.

    La partie ci-dessous fonctionne-t-elle ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $P2 = new Auto_Produit(2,"Hihihi",0.12,12.0);
    Car votre constructeur n'attend visiblement aucun paramètre.

Discussions similaires

  1. Réponses: 11
    Dernier message: 11/06/2010, 14h12
  2. [Joomla!] Erreur Call to a member function on a non-object
    Par tchaw dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 27/01/2010, 21h53
  3. [PHP 5.2] Problème : Call to a member function on a non-object
    Par Docteur_Hareng dans le forum Langage
    Réponses: 4
    Dernier message: 10/07/2009, 10h50
  4. Fatal error: Call to a member function on a non-object
    Par alemat13 dans le forum Langage
    Réponses: 6
    Dernier message: 31/12/2007, 17h22
  5. [phpToPDF] "Call to a member function on a non-object"
    Par pikatshu dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 16/04/2007, 18h47

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