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 :

[Debutant - OO] Ma fonction __set() ne fonctionne pas [PHP 5.2]


Sujet :

Langage PHP

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut [Debutant - OO] Ma fonction __set() ne fonctionne pas
    Bonjour à tous,
    J'essaye de faire un exercice en OO et je bloque sur ce que me dit le livre.

    J'ai créé une classe de la sorte:
    Code PHP : 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
     
    class Field {
    	public $accept;
    	public $accesskey;
    	public $align;
    	public $alt;
    	public $border;
    	public $checked;
    	public $dir;
    	public $disabled;
    	public $height;
    	public $hspace;
    	public $lang;
    	public $maxlength;
    	public $onblur;
    	public $onchange;
    	public $ondblclick;
    	public $onfocus;
    	public $onkeydown;
    	public $onkeypress;
    	public $onkeyup;
    	public $onmousedown;
    	public $onmousemove;
    	public $onmouseout;
    	public $onmouseover;
    	public $onmouseup;
    	public $onselect;
    	public $readonly;
    	public $size;
    	public $src;
    	public $style;
    	public $tabindex;
    	public $title;
    	public $usemap;
    	public $width;
     
     
    	public $field;
    	public $attribut;
    	function __construct($id,$name,$class,$value){
    		$this->field = '<input id="'.$id.'" name="'.$name.'" class="'.$class.'" value="'.$value.'" />';
    	}
     
    	function __get($name){
    		return $this-->$name;
    	}
     
    	function __set($name, $value){
    		$this->$name=$value;
    	}
     
     
    	function Display(){
    		echo $this->field;
    	}
     
    }

    Puis je l'instancie de cette manière:
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    $firstname = new Field('id','firstname','class','');
    J'affiche le résultat ainsi:
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    $firstname->Display();

    Jusqu'à la, tout va bien.

    Maintenant j'aimerais faire usage de la function __set() and __get().
    Donc pour donner une valeur à
    $accept;
    e fais ainsi:
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $firstname = new Field('id','firstname','class',''); 
    $firtsname->$accept = 5; //ca aucun sans de mettre 5, mais c'est un exercice...
    $firstname->Display();

    Mais ma page me retourne ce message d'erreur:
    Notice: Undefined variable: accept in /Applications/MAMP/htdocs/formulaire/index.php on line 24

    Fatal error: Cannot access empty property in /Applications/MAMP/htdocs/formulaire/index.php on line 24
    Je ne comprend pas pourquoi car $accept est public et dans mon livre, il me dit que la fonction __set($name,$value), est automatiquement appelée

    Pouvez vous m'éclairessir?

    Merci
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  2. #2
    Membre éprouvé Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Points : 952
    Points
    952
    Par défaut
    Alors je vais essayer de t'éclairer.

    La syntaxe à mettre en place est la suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $firtsname->accept = 5;
    On ne répète pas le $
    Ce qui produit d'abord un notice car $accept n'existe pas ensuite une fatal car tu essaie d'assigner une valeur à une propriété sans nom.

    De plus, comme tous les membres de ta classe sont publiques, on ne passera pas par la méthode magique __set() ( ou __get() pour lire).
    Ces méthodes sont là pour répondre à des cas précis d'utilisation. Propriété inexistantes, ( ou non publique ) que tu rencontreras surement plus tard.

    Pour vérifier, mon propos tu peux mettre en place un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo 'je suis dans ma méthode __set()';
    dans la méthode __set() et lancer le script, aucun message ne devrait apparaitre.

    Ensuite tu peux changer la porté de la variable ( public->private ) ou bien assigner une variable imaginaire et tu devrais voir le echo
    Pierre
    1. Dans le manuel ( PHP, MySQL,..., rayez la mention inutile), tu te plongeras à deux fois plutôt qu'aucune.
    2. Dans la doc php, tu liras attentivement les sections Chaines de caractères, Tableaux et Système de fichiers
    3. Un code rapide c'est bien, un code maintenable c'est mieux
    ...

    Why was the font tag an orphan ? Because it didn't have a font-family.

  3. #3
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    ok, ben ton mon livre c'était marqué avec le $ (répèté). Ca doit etre donc un faute de frappe

    Ceci dit j'ai pas tout compris.
    Si j'attribue la valeur de 5, et que je veux ensuite afficher cette valeur, je doit bien faire ceci?
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $firtsname->accept = 5;
    echo $firstname->accept;

    en sachat que j'ai modifié mon atrribut ainsi:
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    class Field{
    	var $accept;
    ... suite du code...
    Mais pourquoi elle ne doit pas etre en public?
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  4. #4
    Membre éprouvé Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Points : 952
    Points
    952
    Par défaut
    N'utilise pas var si tu développe en php5. Cela date du modèle objet de php4

    Ta propriété peut très bien être publique,
    c'est à toi de voir quand tu conçoit ta classe.
    Je te donnai un moyen de visualiser l'utilité de la méthode __set()

    Pour l'affectation et la récupération c'est du tout bon
    Pierre
    1. Dans le manuel ( PHP, MySQL,..., rayez la mention inutile), tu te plongeras à deux fois plutôt qu'aucune.
    2. Dans la doc php, tu liras attentivement les sections Chaines de caractères, Tableaux et Système de fichiers
    3. Un code rapide c'est bien, un code maintenable c'est mieux
    ...

    Why was the font tag an orphan ? Because it didn't have a font-family.

  5. #5
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    Hello,
    Je suis désolé, mais je ne comprend toujours pas.

    J'ai aussi essayé de lamaniere suivante.
    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
     
    class Field {
    	public $accept;
    	public $accesskey;
    	public $align;
    	public $alt;
    	public $border;
    	public $checked;
    	public $dir;
    	public $disabled;
    	public $height;
    	public $hspace;
    	public $lang;
    	public $maxlength;
    	public $onblur;
    	public $onchange;
    	public $ondblclick;
    	public $onfocus;
    	public $onkeydown;
    	public $onkeypress;
    	public $onkeyup;
    	public $onmousedown;
    	public $onmousemove;
    	public $onmouseout;
    	public $onmouseover;
    	public $onmouseup;
    	public $onselect;
    	public $readonly;
    	public $size;
    	public $src;
    	public $style;
    	public $tabindex;
    	public $title;
    	public $usemap;
    	public $width;
     
     
    	public $field;
    	public $attribut;
     
    	public function __construct($id,$name,$class,$value){
    		$this->field = '<input id="'.$id.'" name="'.$name.'" class="'.$class.'" value="'.$value.'" />';
    	}
    	/*
    	public function __get($name){
    		return $this-->$name;
    	}
     
    	public function __set($name, $value){
    		$this->$name=$value;
    	}
    	*/
     
     
    	public function Display(){
    		echo $this->field;
    		echo $this->accept;
    	}
     
    }
    puis:
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $firtsname->accept = "uuu";
    echo $firstname->accept;

    mais nada, ca n'affiche pas "uuu"

    je serai ok (je préfère) de passer tous mes attribut à private, et les "parametre" avec les mettodes magique __set() et __get....
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  6. #6
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    mince j'avais fait une faute de frappe......
    La ca marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $firstname->accept = "uuu";
    echo $firstname->accept;
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  7. #7
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    Ok, je commance a comprendre. En fait, la honte j'avais une faute de frappe qui m'a fait perdre du temps, et nager....

    Voilà, j'ai corrigé ainsi, mais là je ne comprend pas pourquoi ca me retourne "1"

    Code PHP : 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
     
    class Field {
    	private $accept;
    	public $accesskey;
     
           ..... suite des déclarations des attributs.....
     
         public function __construct($id,$name,$class,$value){
    		$this->field = '<input id="'.$id.'" name="'.$name.'" class="'.$class.'" value="'.$value.'" /><br />';
    	}
     
    	public function __set($name, $value){
    		echo 'Defini '.$name.' a : '.$value;
    		$this->$name=$value;
    		echo '(s)<br />';
    	}
     
    	public function __get($name){
    		echo 'Affiche '.$name.' : ';
    		echo $this-->$name;
    		echo '(g)<br />';
    	}
     
    	public function Display(){
    		echo $this->field;
    	}
     
    }
    Ceci m'affiche 1 au lieu de "zzzz"
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $firstname->accept = "zzzz";
    $firstname->accept;
    Defini accept a : zzzz(s)
    Affiche accept : 1(g)
    Why?
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  8. #8
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    ok, j'ai compris, je vais me coucher, suis trop fâtigué. Je pollue le forum.
    Sorry

    J'ai mis
    $this-->$name

    alors que je devais mettre
    $this->$name

    la ca marche

    Sorry pour le dérangement
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 11/09/2006, 17h46
  2. [Mail] fonction mail qui fonctionne pas
    Par digger dans le forum Langage
    Réponses: 3
    Dernier message: 31/08/2006, 22h28
  3. fonction ridicule qui fonctionne pas sous firefox
    Par Isses dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 27/06/2006, 12h08
  4. fonction plpgsql qui fonctionne pas...
    Par Empty_body dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 15/01/2006, 18h22
  5. La fonction CurrentDb() ne fonctionne pas dans une requête
    Par Sébastien Le Goyet dans le forum Access
    Réponses: 8
    Dernier message: 24/11/2005, 17h46

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