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

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 220
    Points : 100
    Points
    100
    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 éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    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 régulier
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 220
    Points : 100
    Points
    100
    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 éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    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 régulier
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 220
    Points : 100
    Points
    100
    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 éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    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.

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 220
    Points : 100
    Points
    100
    Par défaut
    Citation Envoyé par Petibidon Voir le message
    je trouve PHP assez désagréable à coder.
    Tu compare PHP à quel autre langage? Java?

    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.
    Tu peux m'en dire plus sur ces tests ? Cela m'intéresse beaucoup. On est quelquefois surpris de l'usage "excessif" (disons énorme) que font les utilisateurs ... Moi-même, j'ai été agacé un jour par une super-application prévue pour maxi. 10 000 mots ... Moi, je voulais que cela fonctionne avec 40 000 mots ... Lenteur abominable du code etc.

    Donc, j'aime bien les codes-turbo !

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    Tu compare PHP à quel autre langage? Java?
    En effet, Java, bien que beaucoup plus rigoureux, est beaucoup plus agréable en terme de syntaxe. Je trouve très saoulant ces $ et autres ->

    Quant aux tests, j'avais codé il y a fort longtemps une classe de template du même genre que celle qui m'a servi de démonstration dans ce fil. Je m'appuyais sur __set de la manière que je t'ai montré, et __get pour récupérer les blocs HTML qui peuvent être répétés par une boucle.

    Après un petit bench histoire de voir si la classe était pas trop catastrophique au niveau perfs, j'ai remplacé __set et __get par des noms de fonctions classiques (genre setValue, getBlock) sans modifier la moindre ligne du code de ces fonctions. Les performances étaient ensuite bien meilleures.

    Juste un truc toutefois. Si tu veux de la super perf, oublie PHP. Les performances de PHP sont correctes pour son utilisation courante. Mais tu peux faire beaucoup mieux avec d'autres langages. C'est juste beaucoup plus chiant. PHP est juste un bon compromis entre perfs et facilité d'utilisation.

    De même, la programmation OO ne te permettra pas de gagner en perfs. Théoriquement c'est même le contraire. Un code de très bonne qualité en tout procédural sera toujours plus rapide qu'un code de très bonne qualité en objet. Par contre lorsque tu as bien pigé la prog OO, faire du code de très bonne qualité est plus facile parce que tu te concentres toujours sur un point particulier au lieu de développer tant bien que mal un ensemble global. C'est beaucoup plus facile. Du coup un bon code OO a de fortes chances d'être plus performant qu'un code procédural mal écrit.

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 220
    Points : 100
    Points
    100
    Par défaut
    D'accord.
    Merci pour les info.

    A bientôt.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 11/09/2006, 16h55
  2. Les polices dans les tables et les requêts
    Par zooffy dans le forum Access
    Réponses: 3
    Dernier message: 21/06/2006, 11h06
  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, 18h34

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