comportement class php

Eléphant du PHP | 110 Messages

01 mai 2008, 21:46

slt atoutes et a tous

j'ai une class php que j'ecris et je ne comprend pas un comportement :
voici le code de ma class
<?php

class sql_xml{
	
	public $requete="charles"; 
	
public function __construct(){
		
                                         echo $this->requete;
        
                                         }// fin constructeur 




}// fin class

?>
lorque je creer une instance de cette class(un objet $test=new sql_xml()) et que je definit ma proprietée requete a l'aide du code suivant :
$test->requete="bruno";
echo $test->requete;
j'obtiens bien un resultat bruno pour le code ci-dessu mais pour l'echo de mon constructeur j'obtiens "charles". mon constrcuteur se comporte comme si je n'avais pas redefinie ma propriétée requete a "bruno"
voilà je me mélange un peu les neurones avec se comportement .
merci de votre aide
A+

Mammouth du PHP | 19672 Messages

01 mai 2008, 22:47

Si tu fais de l'objet PHP5, utilise les méthodes magique, c'est bien plus efficace et ce sera surtout plus propre. Exemple (suis les commentaires ajoutés, ils sont importants)
<?php
class sql_xml
{
    /**
     * Propriété requete.
     *
     * @var String
     */
    private $requete;

    /**
     * Constructeur.
     *
     * Définit la valeur par défaut de la propriété sql_xml::requete
     */
    public function __construct()
    {
        $this->requete = "charles";
    }// fin constructeur

    /**
     * Assignation d'une valeur à une propriété de la classe.
     *
     * Permet d'assigner une valeur à une propriété même privée de la classe.
     * Cette méthode magique sera automatiquement apelée lorsqu'on tentera d'assigner
     * directement une valeur à une propriété depuis l'extérieur de la classe.
     *
     * @param String $var
     * @param Mixed  $valeur
     */
    public function __set($var, $valeur)
    {
        $this->{$var} = $valeur;
    }

    /**
     * Récupération de la valeur d'une propriété de la classe.
     * 
     * (Si elle existe)
     *
     * @param  String $var
     * @return mixed
     */
    public function __get($var)
    {
        if(isset($this->{$var}))
        {
            return $this->{$var};
        }
        else
        {
            return false;
        }
    }
}// fin class

$test = new sql_xml();
$test->requete = "bruno";
echo("<p>". $test->requete ."</p>");
?>
Et tu noteras que la propriété requete que tu avais mise en public est ici en private C'est l'intérêt des méthodes magiques.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 110 Messages

02 mai 2008, 00:28

merci pour cette explication je ne connaissait pas les methodes magiques et ca a l'air tres interessant.
j'ai testé l'exemple que tu m'as fournis mais il ne repond pas a ma demande, surement que je me suis mal exprimé. en effet ton code me renvois bien la valeur modifié de la propriétée, le mien, bien que moins propre, la renvoyais aussi ds le fichier php qui appel la classe , mais les deux methodes ne renvoient pas la valeur de la propriété modifiée ds la méthode construct . je reviens donc a zero . ce que je veux c'est récupérer ds le constrcut la valeur de la propriété modifiée.
example : je test ton code
<?php
class test {
public $br="tutu";
private $rt;

public function __construct(){


echo $this->br;
}// fin construct

public function __set($var,$valeur){

$this->{$var}=$valeur;

}//fin set 
public function __get($var)
    {
        if(isset($this->{$var}))
        {
            return $this->{$var};
        }
        else
        {
            return false;
        }
    } 


}// fin class
$objet=new test ();
$objet->br="bibi";
?>
ds ce cas le constructeur me renvois la valeur de la propriete= tutu alors que je voudrais qu'il me renvois celle passer a la création de l'instance : bibi.
une autre petite précision si je peux me permettre, pourquoi les {} ds ce code a coté de $this ?
$this->{$var}=$valeur;
merci encore
A+[/code]

Mammouth du PHP | 19672 Messages

02 mai 2008, 07:06

Ce que tu veux faire n'est pas logique. Le constructeur initialise l'objet et éventuellement initialise la valeur de certaines propriétés. Dans ton premier exemple, ta propriété sql_xml::requete valait "charles" lors de la création de l'instance. Tu assignes ensuite la valeur "bruno" et tu affiches cette valeur. Ce qui manquait dans ton code, c'est l'instanciation, c'est à dire le new sql_xml(). Par rapport à ton exemple, le mien effectue exactement la même chose, création de l'instance de classe en plus. Donc essaye d'être plus clair dans ce que tu veux faire parce que je ne vois pas trop... :-k

Pour les accolades : normalement, pour assigner une valeur à la propriété sql_xml::requete, il aurait fallu dans la méthode que j'écrive $thi->requete = $valeur. donc "requete" sans le "$" initial. Or là, la méthode magique __set() permet d'assigner une valeur à n'importe laquelle des propriétés de la classe. Si je veux assigner une valeur à la propriété "sql_xml::requête", je vais donc faire $objet->requete = $valeur : la méthode magique va capturer "requete" et mettre cette valeur dans une variable qui sera ici le premier paramètre de la méthode __set() mais je ne peux pas écrire $this->$var puisque je dois écrire $this->requete : donc je fais une concaténation pour utiliser la valeur de $var, pas $var lui-même.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 110 Messages

02 mai 2008, 07:50

salut
merci pour l'explication {} et pour le reste :wink:
desolé si je ne suis pas arrivé a etre assez clair:
je definis et initialise une propriété de ma class example:
class tata{
public $requete;

public function __construct(){}
.....
}
ensuite la valeur de cette propriété je veux la definir en creant mon objet
$test=new tata ();
$test->$requete="tutute",
puis ds mon constructeur j'aimerais utiliser cette valeur
sauf que la je m'apercois que ce que je veux est absurde car je viens d'utiliser mon constructeur pour creer mon objet et qu'apres je voudrais récupérer une valeur des propriété.
en fait je crois que je doit simplement rajouter une methode qui recuperera la valeur de ma prop initialisé par mon constrcuteur .

je crois que je suis encore moins clair
:wink:
y'a qqu chose qui cloche la dedans j'y retourne immediatement

merci pour toutes tes precisions
A+

Mammouth du PHP | 19672 Messages

02 mai 2008, 09:04

Dans ce cas, ajoute la valeur dans le constructeur :
<?php
class sql_xml
{
    /**
     * Propriété requete.
     *
     * @var String
     */
    private $requete;

    /**
     * Constructeur.
     *
     * Définit la valeur de la propriété sql_xml::requete
     * 
     * @param   String  $valeur (Optionnel) valeur de la propriété sql_xml::requete
     */
    public function __construct($valeur = "charles")
    {
        $this->requete = $valeur;
    }// fin constructeur

    /**
     * Assignation d'une valeur à une propriété de la classe.
     *
     * Permet d'assigner une valeur à une propriété même privée de la classe.
     * Cette méthode magique sera automatiquement apelée lorsqu'on tentera d'assigner
     * directement une valeur à une propriété depuis l'extérieur de la classe.
     *
     * @param String $var
     * @param Mixed  $valeur
     */
    public function __set($var, $valeur)
    {
        $this->{$var} = $valeur;
    }

    /**
     * Récupération de la valeur d'une propriété de la classe.
     * 
     * (Si elle existe)
     *
     * @param  String $var
     * @return mixed
     */
    public function __get($var)
    {
        if(isset($this->{$var}))
        {
            return $this->{$var};
        }
        else
        {
            return false;
        }
    }
}// fin class

/* Création d'une instance de classe avec une valeur pour sql_xml::requete */
$test = new sql_xml("bruno");

echo("<p>". $test->requete ."</p>");
?>
Là, le constructeur attend un paramètre optionnel. Optionnel parce qu'on lui a affecté une valeur par défaut, ici "charles". Maintenant regarde l'exécution : on crée une instance mais en envoyant une autre valeur : "bruno" : dans ce cas, cette valeur va être utilisée en lieu et place de la valeur par défaut et tu n'as plus besoin de la ligne affectant directement la valeur à la propriété. Et du coup, la méthode __set() ne sera utilisée que si tu veux changer cette valeur en cours d'utilisation de ton objet.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 110 Messages

02 mai 2008, 12:45

slt
et tout d'abord un grand merci pour toutes ces explications, je devrais même dire cette petite leçon de savoir faire.
c'était le solution que je cherchais, il me semble évident maintenant que tu me l'as montré :wink: qu'il fallait passer la prop en argument du constructeur.
merci encore et a bientot