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 : Associer une fonction à un attribut [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut POO : Associer une fonction à un attribut
    Bonjour,

    Je pratique Php depuis pas mal de temps et commence à aborder la programmation objet via Php 5. Je bloque actuellement sur un petit soucis d'optimisation mais qui accélèrerai et clarifiai la lecture de mon code.

    Je recherche un moyen d'associer une fonction à un attribut pour un class donnée.

    Par exemple pour que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $voiture->couleur;
    Exécute une fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $voiture->couleur = $voiture->get_couleur();
    sans que je n'ai besoin de l'écrire explicitement.

    Merci à vous, je n'ai trouvé de tutoriel sur l'objet que pour un niveau débutant sur la toile.
    En attendant je continu de lire le forum et vous tiendrai avancé via le post.

    Dimitri A.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 68
    Points : 97
    Points
    97
    Par défaut
    Essaye la methode magique __get():

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    class toto {
     
         public function get_couleur($voiture) {
                //
         }
     
         public __get($voiture) {
               return get_couleur($voiture);
         }
     
    }

  3. #3
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 887
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 887
    Points : 16 320
    Points
    16 320
    Par défaut
    Sauf que :

    1. Ce n'est pas l'objet qui est transmis à la méthode __get() mais le nom de la propriété ;
    2. Ca ne fonctionne que pour une propriété qui n'est pas déclarée dans la classe (important de le préciser).

    Donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Voiture {
     
    public function __get( $name ) {
       return $this->{'get_' . $name}();
    }
     
    public function get_couleur() {
       return 'bleue';
    }
     
    }
     
    $voiture = new Voiture;
    echo $voiture->couleur;

  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
    J'ai un peu de mal à voir comment en accédant à une variable qui renvoie implicitement sur une fonction on arrive à simplifier la lecture de son code

    Généralement on fait le contraire : On encapsule les propriétés pour n'y accéder qu'au travers de méthodes.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Excellent c'est tout à fait ce que je recherchais, grand merci à vous deux

    De plus je ne connaissais pas non plus la possible utilisation de {'get_' . $var} qui je pense va m'être fort utile pour la suite.

    Encore merci, Dimitri.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Enfaite ca va être plus simple dans le sens ou je vais avoir une très grosse class avec beaucoup de fonctions et un demi-million de requêtes / jour (pour l'instant).

    enfaite tout sera dans la classe et mes page seront beaucoup plus simples.

    Du style :

    $v1 = new $voiture;
    echo $v1->couleur;


    De ce fait le code sera optimisé au niveau ou si je n'ai pas besoin de la couleur, je ne fais pas de $v1->couleur; et donc les calculs pour déterminer la couleur ne se feront pas. J'aurai juste mon __construct();

    Maintenant il faut que je vois si le script repasse à chaque fois dans la fonction __get( $name ); lorsque j'utilise $v1->couleur; ou s'il se sert de la précédente valeur. Je crois avoir lu que non mais je vais vérifier tout ca de ce pas afin d'en être certain.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bon je suis de nouveau bloqué à une étape, je souhaite que la fonction appelée via __get ne s'exécute qu'une seule fois pas soucis d'optimisation, j'ai donc ajouté ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public function __get( $name ) {
    		if(!isset($this->$name))
    		 {
    			return $this->{'get_' . $name}();
    		 }
    		 else
    		 {
    			 return $this->$name;
    		 }
    }
    Malheureusement ca ne fonctionne pas et je ne comprends pas pourquoi, pour moi le code est bon...

    J'ai aussi essayé ceci en rajoutant les {} :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	public function __get( $name ) {
    		if(!isset($this->{$name}))
    		 {
    			return $this->{'get_' . $name}();
    		 }
    		 else
    		 {
    			 return $this->{$name};
    		 }
    	}
    Sans grand résultat,
    Si quelqu'un à une idée je suis preneur je crois que je me perds un peu dans toutes ses nouvelles fonctions.

    EDIT : Je pensais que les fonctions magiques étaient plus performante mais je me suis trompé, j'utiliserai donc les propriétés et fonctions objet classiques

    Merci encore,
    Dimitri

  8. #8
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 241
    Points
    20 241
    Par défaut
    As tu regardé du coté des closures ou fonction anonymes plutot que de passer par __get __set.

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

Discussions similaires

  1. associer une fonction à une <div>
    Par Mike35 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 02/09/2008, 02h43
  2. Réponses: 1
    Dernier message: 02/05/2008, 20h34
  3. [POO] lancer une fonction JS au demarage de la page
    Par rragnarok dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 15/03/2008, 16h51
  4. [POO] cacher une fonction
    Par Aizen64 dans le forum Langage
    Réponses: 3
    Dernier message: 10/11/2007, 13h35
  5. associer une fonction a delegate
    Par abbd dans le forum C++/CLI
    Réponses: 1
    Dernier message: 14/07/2007, 21h58

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