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] Erreur à l'utilisation de la variable $this


Sujet :

Langage PHP

  1. #1
    rib
    rib est déconnecté
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 70
    Points : 55
    Points
    55
    Par défaut [POO] Erreur à l'utilisation de la variable $this
    j'utlise une solution xampp (PHP Version 5.1.6),apparement il y a des gens sur le net qui disent que c un bug de php mais y aurait'il qqun ici pour m'aider a trouver la source du probleme svp?

    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
    <?php
    class Items {
       static private $instance=false;
       private $Collection=false;
     
     
        // Ajouter un item dans la colection
    	public function AddItem($item, $key){
    		$Collection[$key] = $item; 
    	}
     
    	// Recuperer un item grace a son nom
    	public function GetItem($key){
    		if(Items::set($this->Collection, $key)){
    			return current($this->Collection);
    		}
    		else{ return "Error0";}
    	}
     
    	//fonction set qui sert a se positioner dans la collection
    	private function set($Collection, $key){
        	reset($Collection);
    	    while($current=key($Collection)){
    		   if($current==$key)
    		   {
    			   return true;
    		   }
    		   next($Collection);
    	   }
    	   return false;
    	 }	
     
       // le constructeur est privé, pour empêcher qu'il soit directement instancié 
       private function __construct() {
          $this->Collection = array();       
       }
     
       // méthode statique pour créer une instance de la classe Multilingue
       static function instance() {
           if(!Items::$instance) {
               Items::$instance = new Items();
           }
           return Items::$instance;
       }
    }
     
    ?>
    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
    <?php
    include 'Items.php';
     
    $I = Items::instance();
    Items::AddItem("test", "key1");
    Items::AddItem("test2", "key2");
    Items::AddItem("test3", "key3");
     
    $A = Items::GetItem("key1");
    $B = Items::GetItem("key2");
    $C = Items::GetItem("key3");
     
    echo $A + ";" + $B + ";" + $C + ".";
     
    ?>

  2. #2
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Pour moi AddItem et GetItem ne sont pas des méthodes statiques, elles doivent être appelées sur une instance de la classe.

  3. #3
    rib
    rib est déconnecté
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 70
    Points : 55
    Points
    55
    Par défaut
    AddItem ne retourne pas d'erreur, l'ereur se produit a l'appel dela fonction set()

  4. #4
    rib
    rib est déconnecté
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 70
    Points : 55
    Points
    55
    Par défaut
    ici il disent que c un bug de php mais je sait pas comment metre a jour php de xampp
    http://bugs.php.net/bug.php?id=24403

  5. #5
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Citation Envoyé par rib
    AddItem ne retourne pas d'erreur, l'ereur se produit a l'appel dela fonction set()
    Le problème que ça me pose est surtout d'ordre logique : comment ajoute-t-on un item à un objet qui n'est pas défini ? C'est une autre manière de dire qu'on ne peut pas utiliser $this en-dehors d'une instance.

    Pour moi PHP aurait dû t'empêcher d'appeler AddItem.

    Citation Envoyé par rib
    ici il disent que c un bug de php mais je sait pas comment metre a jour php de xampp
    http://bugs.php.net/bug.php?id=24403
    Je n'ai pas l'impression que ça soit le même problème (mais je peux me tromper)

  6. #6
    rib
    rib est déconnecté
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 70
    Points : 55
    Points
    55
    Par défaut
    comment sa pas definit?

  7. #7
    Membre éclairé
    Avatar de Dia_FR
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2006
    Messages
    512
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2006
    Messages : 512
    Points : 708
    Points
    708
    Par défaut
    t'as testé avec $I->AddItem au lieu de Items::AddItem ?
    pareil pour get
    Dia [ Page DVP ] [ Site pro ]

  8. #8
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Citation Envoyé par rib
    comment sa pas definit?
    quand tu appelles Items::AddItem(...), tu n'appelles pas la méthode d'une instance, tu appelles une méthode statique d'une classe (ce qui n'est pas le cas). La méthode n'est pas mise en relation avec une instance (donc, pas de $this).
    Je pense qu'il faudrait que tu fasses :

  9. #9
    rib
    rib est déconnecté
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 70
    Points : 55
    Points
    55
    Par défaut
    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
    <?php
    include 'Items.php';
     
    $I = Items::instance();
    //Items::AddItem("test", "key1");
    //Items::AddItem("test2", "key2");
    //Items::AddItem("test3", "key3");
    $I->AddItem("test", "key1");
    $J->AddItem("test", "key2");
    $K->AddItem("test", "key3");
     
     
    $A->GetItem("key1");
    $B->GetItem("key2");
    $C->GetItem("key3");
     
     
     
    //$A = Items::GetItem("key1");
    //$B = Items::GetItem("key2");
    //$C = Items::GetItem("key3");
     
    echo $A + ";" + $B + ";" + $C + ".";
     
    ?>

    Fatal error: Call to a member function AddItem() on a non-object in C:\Program Files\xampp\htdocs\KORPORATE\test_item.php on line 9

  10. #10
    Membre éclairé
    Avatar de Dia_FR
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2006
    Messages
    512
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2006
    Messages : 512
    Points : 708
    Points
    708
    Par défaut
    dans Instance tu crées un objet de classe Items mais tu récupères pas de référence dessus, Instance renvoie un booléen

    donc $I est un booléen à priori

    donc ça risque pas de marcher comme ça, j'avais regardé d'assez prêt
    fais un constructeur classique où tu changes la valeur de $instance (ce que tu ne fais pas dans la méthode Instance d'ailleurs) et tu l'appelles avec un new

    de plus $J, $K, $A, $B et $C ne sont pas définis
    Dia [ Page DVP ] [ Site pro ]

  11. #11
    rib
    rib est déconnecté
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 70
    Points : 55
    Points
    55
    Par défaut
    la methode instance sert juste a verifier si il ny a pas deja un objet de cet classe instancie et il sert a totaliser le nombre d'instances(static) et si y en a pas elle instance ma classe Item()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     if(!Items::$instance) {Items::$instance = new Items();}
    ce qui appelle automatiquement ce constructeur :
    private function __construct() {
          $this->Collection = array();       
       }
    et celui ci instancie mon tableau ...
    c du php5 enfin reprenez moi si je me trompe mais cet methode fonctionne tres bien avec d'autres classes que j'utilise.

  12. #12
    rib
    rib est déconnecté
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 70
    Points : 55
    Points
    55
    Par défaut
    sinon y aurai pas une collection toute faite dans l'api php dans le style ds hashtable en java?

  13. #13
    Membre éclairé
    Avatar de Dia_FR
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2006
    Messages
    512
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2006
    Messages : 512
    Points : 708
    Points
    708
    Par défaut
    oulala j'ai lu en diagonale désolé

    donc ouais, c'est bon, la seule remarque à retenir de ce que j'ai dit avant c'est que y a que $I qu'est un objet de classe Items, y a que lui qui peut appeler les méthodes
    Dia [ Page DVP ] [ Site pro ]

  14. #14
    rib
    rib est déconnecté
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 70
    Points : 55
    Points
    55
    Par défaut
    bon :

    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
    <?php
    include 'Items.php';
     
    //$I = Items::instance();
    //Items::AddItem("test", "key1");
    //Items::AddItem("test2", "key2");
    //Items::AddItem("test3", "key3");
    $I = new Items();
     
    $I->AddItem("test", "key1");
    $I->AddItem("test1", "key2");
    $I->AddItem("test2", "key3");
     
    $A = $I->GetItem("key1");
    $B = $I->GetItem("key2");
    $C = $I->GetItem("key3");
     
    //$A = Items::GetItem("key1");
    //$B = Items::GetItem("key2");
    //$C = Items::GetItem("key3");
     
    echo $A + ";" + $B + ";" + $C + ".";
     
    ?>
    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
    <?php
    class Items {
       static private $instance=false;
       private $Collection=false;
     
     
        // Ajouter un item dans la colection
    	public function AddItem($item, $key){
    		$Collection[$key] = $item; 
    	}
     
    	// Recuperer un item grace a son nom
    	public function GetItem($key){
    		if(Items::set($this->Collection, $key)){
    			return current($this->Collection);
    		}
    		else{ return "Error0";}
    	}
     
    	//fonction set qui sert a se positioner dans la collection
    	private function set($Collection, $key){
        	reset($Collection);
    	    while($current=key($Collection)){
    		   if($current==$key)
    		   {
    			   return true;
    		   }
    		   next($Collection);
    	   }
    	   return false;
    	 }	
     
     
    	public function Items(){
    	$this->Collection = array();
    	}
       // le constructeur est privé, pour empêcher qu'il soit directement instancié 
       //private function __construct() {
         //        
       //}
     
       // méthode statique pour créer une instance de la classe Multilingue
       static function instance() {
           if(!Items::$instance) {
               Items::$instance = new Items();
           }
           return Items::$instance;
       }
    }
     
    ?>
    bon la y a un constructeur public normal mais sa me retourne 0 sur l'echo au lieu de la chaine de caractere attendue...?
    mais cet methode me plait pas car le constructeur est public....
    je prefererais pouvoir utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $I = Items::instance();
    Items::AddItem("test", "key1");
    $A = Items::GetItem("key1");

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Points : 691
    Points
    691
    Par défaut
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     $tab = ArrayObject();
    $tab['key1'] = $val1;
    echo $tab['key1'];
    et tu peut etendre ArrayObjet et utiliser un singleton pour l'unicité

  16. #16
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(Items::set($this->Collection, $key)){
    Tu fais un appel statique sur une methode qui ne l'est pas

    Sinon y a moyen de mettre ton constructeur en protected ?

Discussions similaires

  1. [POO] Erreur : utilisation Event
    Par TheReturnOfMuton dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 27/05/2008, 11h43
  2. [POO] Erreur lors de l'utilisation de $this en PHP5
    Par Ekimasu dans le forum Langage
    Réponses: 4
    Dernier message: 03/11/2006, 20h21
  3. Utilisation d'une variable sur plusieurs unités
    Par Yamaneko dans le forum Langage
    Réponses: 2
    Dernier message: 05/06/2003, 11h23
  4. Erreur dans l'utilisation de SWAP
    Par mire dans le forum Langage
    Réponses: 12
    Dernier message: 15/03/2003, 21h39
  5. Réponses: 4
    Dernier message: 05/06/2002, 14h35

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