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 :

Surcharger les attributs et les méthodes [PHP 5.3]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 220
    Par défaut Surcharger les attributs et les méthodes
    Bonjour,

    J'ai du mal avec mon tuto poo PHP.

    J'aimerais être certain d'avoir compris; ma définition ci-dessous est-elle bonne :

    Surcharger les attributs et les méthodes, c'est utiliser des attributs ou des méthodes inexistantes ou inaccessibles grâce aux méthodes magiques _set et _get.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Par défaut
    Oui et non.

    La qualité de PHP, et son plus gros défaut aussi sont sa permissivité.
    Tu peux ajouter des membres à un objet sans même t'en rendre compte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class Toto{
    	public $truc;
    }
     
    $t = new Toto();
    $t->machin = "banane";
    print_r( $t );
    Les méthodes "magiques" __set et __get permettent en quelque sorte de prévoir l'imprévu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class Titi{
    	public $truc;
     
    	function __set( $key , $val ){
    		$this->$key = strtoupper( $val );
    	}
    }
     
    $t1 = new Titi();
    $t1->truc = "pouetpouet";
    $t1->machin = "camion";
    print_r( $t1 );
    Dans la plupart des cas, il vaut mieux prévoir de ne pas utiliser ces méthodes magiques et structurer ses classes et définir ses méthodes de manière à ne pas avoir besoin de recourir à celles ci.
    Elles peuvent être pratiques dans des cas très précis, mais théoriquement elles ne sont pas indispensables.

    C'est bon de les connaitre mais il n'est pas nécessaire de se prendre la tête avec ça pour apprendre l'objet (j'irais même jusqu'à dire qu'il s'agit là de mauvaises pratiques, mais c'est un avis qui n'engage que moi )

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 220
    Par défaut
    Oui, autrement dit les vrais pro. n'utilisent (presque) jamais ces méthodes?

    Sauf peut-être quand ces fonctions "peuvent être pratiques dans des cas très précis, mais théoriquement elles ne sont pas indispensables."

    ... Sans entrée dans des détails hors de la portée d'un débutant (que je suis), tu penses à quoi?

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Par défaut
    Un exemple simple avec une petite classe utilitaire limitée qui va gérer des modèles de documents.

    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
    <?php
    class Modele{
    	private $modele;
     
    	function __construct( $texte ){
    		$this->modele = $texte;
    	}
     
    	function remplace( $variable, $valeur ){
    		$this->modele = str_replace( '[' . $variable . ']' , $valeur , $this->modele );
    	}
     
    	function __set( $var , $val ){
    		$this->remplace( $var , $val );
    	}
     
    	function __toString(){
    		return $this->modele;
    	}
    }
     
    $modele = new Modele( '<div><h1>[titre]</h1><p>[texte]</p></div>' );
     
    $modele->remplace( 'titre' , 'Ceci est le titre' );
     
    $modele->texte = 'Ceci est le texte';
     
    echo $modele;
    ?>
    Dans le cas présent, la méthode __set() renvoie vers la méthode remplace(), c'est intéressant pour le développeur fainéant qui n'a pas le courage de taper $modele->remplace( 'truc' , 'machin' ) à chaque fois. Mais ça n'a rien d'indispensable.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 220
    Par défaut
    Merci pour cette réponse bien construite.

    Mais comme je suis assez débutant, je vais être obligé de te poser
    quelques questions qui te paraîtront un peu basiques.

    Tu veux dire que plutôt que d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $modele->remplace ( 'titre' , 'Ceci est le titre' );
    C'est plus cours d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $modele->titre = 'Ceci est le titre';
    Et plutôt que d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $modele->remplace ( 'texte' , 'Ceci est le texte' );
    C'est plus cours d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $modele->texte = 'Ceci est le texte';
    Cela ne me plaît pas beaucoup d'utiliser des fonctions de ce genre
    mais il est vrai que si tu as un code très long cela vaut la peine d'être connu. Plus tard, je te dirais peut-être un immense merci!

    Note-bien que tu lui demandes de faire au moins 2 fonctions plutôt q'une seule. Et justement, si c'est très très très long ... Cela pourrait peut-être ralentir ton code et cela vaudrait alors la peine d'écrire autrement. Je n'en sait rien moi mais c'est bon d'y réfléchir.

    Merci encore pour ta réponse.

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Par défaut
    Tu veux dire que plutôt que d'écrire :
    $modele->remplace ( 'titre' , 'Ceci est le titre' );

    C'est plus cours d'écrire :
    $modele->titre = 'Ceci est le titre';
    Oui c'est le principal intérêt dans le cas présent. A titre personnel, je trouve PHP assez désagréable à coder. Donc ce genre de petit truc qui simplifie la vie est parfois bien agréable

    Note-bien que tu lui demandes de faire au moins 2 fonctions plutôt q'une seule. Et justement, si c'est très très très long ... Cela pourrait peut-être ralentir ton code et cela vaudrait alors la peine d'écrire autrement. Je n'en sait rien moi mais c'est bon d'y réfléchir.
    En l'occurrence, une fonction renvoie sur l'autre (la méthode __set ne fait rien à part déléguer le boulot à la méthode remplace) donc c'est quasiment invisible comme "ralentissement". A noter cependant qu'aux derniers tests que j'avais pu faire, passer par les méthodes magiques est beaucoup moins performant qu'une méthode classique.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 11/09/2006, 17h55
  2. Les polices dans les tables et les requêts
    Par zooffy dans le forum Access
    Réponses: 3
    Dernier message: 21/06/2006, 12h06
  3. [VB6]Enumérer les attributs et les méthodes d'une classe
    Par HPJ dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 04/05/2004, 19h34

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