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] Variable et portée.


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 138
    Points : 123
    Points
    123
    Par défaut [POO] Variable et portée.
    Bonjour,

    Alors je vais rapidement vous expliquer le petit soucis sur lequel je travaille.

    Supposons une class Test, le but serai d'avoir dans cette classe la possibilité d'avoir une variable dont la portée dépasse la classe pour pouvoir être utilisé dans une autre classe ou simplement dans le code principal d'une page.

    Pour l'instant la seule manière que j'ai trouvé et de créer soit un cookie, soit une variable de session, mais je ne trouve pas ça très propre.

    Exemple ::

    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
    session_start();
     
    class Test{
     
    	//variables
     
    	public function __construct()
    	{
    		$var = "une variable";
    		$_SESSION["portee"] = $var;
    		setcookie("portee", $var);
    	}
     
    }
     
    $test = new Test();
     
    echo $_SESSION["portee"];
    echo "<br />";
    echo $_COOKIE["portee"];
     
    ?>
    Ainsi, j'aimerai savoir si il est possible d'avoir le même résultat en utilisant des propriétés de la POO, car pour l'instant je me retrouve assez coincé.

    De plus je cherche à faire cela pour l'utiliser dans une autre classe car je n'ai pas encore trouvé le moyen de faire une passerelle entre deux classes comme dans l'exemple qui suit ::

    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
     
    <?php
     
    class Test{
     
    	//variables
     
    	public function __construct()
    	{
    		$test = "C'est un test";
    		$essai = new TestBis($test);
    	}
     
    }
     
    class TestBis{
     
    	//variables
    	private $test;
     
    	public function __construct($test)
    	{
    		$this->test = $test;
    	}
     
    	public function Afficher(){
    		echo $this->test;
    	}
     
    }
     
    $test = new Test();
    $essai->Afficher();
     
    ?>
    Ici, nous nous retrouvons avec un code d'erreur car forcément PHP ne reconnait pas la variable associée à l'objet créé dans la class Test

    Code Erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Notice: Undefined variable: essai in C:\Program Files\EasyPHP 2.0b1\www\Class\test.php on line 33
     
    Fatal error: Call to a member function Afficher() on a non-object in C:\Program Files\EasyPHP 2.0b1\www\Class\test.php on line 33
    Donc voilà au final, ce qui m'intéresserait, c'est de trouver une solution pour le deuxième cas, et s'il n'en existe pas, trouver une manière plus propre qu'un cookie ou une session pour le premier cas.

    Merci d'avance pour votre aide,

    Cordialement,

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tout dépend de ce que tu veux partager et dans quel but

    Pour repartir de ce que tu as ecrit : pourquoi le declenchement de l'affichage se ferrait en dehors de la classe si tu initialises l'autre classe a l'interieur ?
    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
     
    <?php
     
    class Test{
     
    	//variables
     
    	public function __construct()
    	{
    		$test = "C'est un test";
    		$essai = new TestBis($test);
    		$essai->Afficher();
    	}
     
    }
     
    class TestBis{
     
    	//variables
    	private $test;
     
    	public function __construct($test)
    	{
    		$this->test = $test;
    	}
     
    	public function Afficher(){
    		echo $this->test;
    	}
     
    }
     
    $test = new Test();
    ?>
    Mais regarde aussi ceci :
    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
     
    class Test {
     
    	function __construct()
    	{
    		$this->test = "C'est un test";
     
    	}
     
    }
     
    class TestBis extends Test{
     
    	function Afficher(){
    		echo $this->test;
    	}
     
    }
     
    $test = new TestBis();
    $test->Afficher();
     
    ?>

  3. #3
    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 : 50
    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 Evilam Voir le message
    Supposons une class Test, le but serai d'avoir dans cette classe la possibilité d'avoir une variable dont la portée dépasse la classe pour pouvoir être utilisé dans une autre classe ou simplement dans le code principal d'une page.
    Un attribut statique ne satisferait-il pas ce besoin ?

    De plus je cherche à faire cela pour l'utiliser dans une autre classe car je n'ai pas encore trouvé le moyen de faire une passerelle entre deux classes comme dans l'exemple qui suit ::

    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
     
    <?php
     
    class Test{
     
    	//variables
     
    	public function __construct()
    	{
    		$test = "C'est un test";
    		$essai = new TestBis($test);
    	}
     
    }
     
    class TestBis{
     
    	//variables
    	private $test;
     
    	public function __construct($test)
    	{
    		$this->test = $test;
    	}
     
    	public function Afficher(){
    		echo $this->test;
    	}
     
    }
     
    $test = new Test();
    $essai->Afficher();
     
    ?>
    Alors ça c'est moche ! Mais tout le monde a été débutant un jour.

    Je peux te proposer ceci comme composition d'objets.

    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
    <?php
     
    class Test{
     
        public $essai;
     
        public function __construct()
    	{
    		$test = "C'est un test";
    		$this->essai = new TestBis($test);
    	}
     
    }
     
    $test = new Test();
    $test->essai->Afficher();
    C'est encore un peu moche, mais ça fonctionnera mieux. Faire gaffe aux requirements, au mettre en place un autoload par exemple.

    --- edit ---
    J'avais eu la flemme de lire tout le code de l'excellent Sabotage. Une de ses propositions est la même que moi.
    La première qu'il te propose est en utilisant l'héritage.
    Pour des raisons de flexibilité du code, j'ai tendance a toujours privilégier la composition sur l'héritage. Les goûts et les couleurs...

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 138
    Points : 123
    Points
    123
    Par défaut
    Re,

    Tout d'abord, merci pour les réponses qui répondent très bien à ma demande, cependant, j'ai toujours un peu soif de connaissance ^^'.

    Dans l'exemple de jml94, comment pourrait-on faire un test pour savoir si la class TestBis a été créée ?

    ---> sans utiliser le $test->

    @sabotage, ce que j'écris est à titre d'exemple, il n'y a pas vraiment de logique et ceci porte sur la portée et l'utilisation de la POO.

  5. #5
    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 : 50
    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 Evilam Voir le message
    Dans l'exemple de jml94, comment pourrait-on faire un test pour savoir si la class TestBis a été créée ?

    ---> sans utiliser le $test->
    C'est un peu vache comme question.
    Pourquoi vouloir tester la création de TestBis sans se servir de l'objet $test ?

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 138
    Points : 123
    Points
    123
    Par défaut
    Par exemple si on veut utiliser un rapport d'erreur, il y aura plusieurs classes qui pourront y faire appel, cependant au niveau de la gestion de l'erreur, il faut pouvoir tester si l'objet existe.

    PS:: c'est un exemple, il y a déjà la classe Exception normalement pour ca ^^.

    Donc pour faire un exemple bidon :

    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
     
    class Un{
     public $error;
     public function construct(){
       if//la classe erreur n'existe pas
       $this->error = new Error('test');
     }
    }
     
    class Deux{
     public $error;
     public function construct(){
       $this->error = new Error('premier test');
     }
    }
     
    $essai = new Deux();
    $essai2 = new Un();
     
    //Si l'objet erreur est créé
    //Afficher erreur
     
    //Ici il faut donc savoir si un objet Error existe et pouvoir l'afficher.
    Je sais pas si je me suis bien fait comprendre dans cet exemple, mais il est très intéressant dans un certain nombre de situations si l'on pouvait connaitre si un objet a été créé et une manière "générale" pour le récupérer, sans passer par des classes annexes.

    Merci encore pour la réponse rapide

  7. #7
    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 : 50
    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
    Pour tester l'existence de variables ou d'objet, tu as toujours les fonctions isset, empty, etc...

    Pour tester si une instance d'objet existe, il y a aussi plusieurs façons.
    Comme je ne saisi pas exactement ton besoin, je peux t'orienter vers le pattern Singleton qui, s'il ne correspond pas à ton besoin, te donnera peut-être une piste.
    N'hésites pas à lire tout l'article de Yogui, ses contributions sont précieuses !

    http://g-rossolini.developpez.com/tu...patterns/#LIII

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 138
    Points : 123
    Points
    123
    Par défaut
    Merci pour la réponse, je lirai ca serieusement ce soir, en attendant je dois aller en cours de JAVA.

    Encore merci.

Discussions similaires

  1. [POO] Limiter la portée d'une variable
    Par j0o0 dans le forum Langage
    Réponses: 1
    Dernier message: 04/11/2007, 22h05
  2. [POO] Variable ne contenant pas la valeur attendue
    Par norby042 dans le forum Langage
    Réponses: 5
    Dernier message: 09/11/2006, 11h06
  3. [POO] Variable pas prise en compte
    Par cyrill.gremaud dans le forum Langage
    Réponses: 21
    Dernier message: 18/08/2006, 21h10
  4. Variable et portée
    Par jive dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 06/08/2006, 19h31
  5. [POO] Variable Dynamique de Classe
    Par CNoob dans le forum Langage
    Réponses: 5
    Dernier message: 31/01/2006, 23h05

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