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] Objet se renvoyant lui-même en php5


Sujet :

Langage PHP

  1. #1
    Membre chevronné
    Avatar de stailer
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mars 2003
    Messages
    1 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 136
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    3
    Par défaut [POO] Objet se renvoyant lui-même en php5
    Hello,

    je suis vraiment désolé pour le titre mais je ne vois pas comment nommer mon problème.. ou alors "Objet récursif", mais c'est pas vraiment ça.

    Donc je vous explique :
    J'ai une classe : "Peche", qui va par exemple me permettre, via les iterator de rajouter dynamiquement des "poissons" (je répète bien que c'est un exemple lol) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $this->getPeche()->addPoisson('truite', 25);
    et à chaque fois que je veux ajouter un poisson, je dois utiliser cette ligne de code... Alors quand c'est dans une boucle pas de souci.. Mais si c'est en dur, c'est vraiment dommage de répéter autant de texte ! alors que je pourrais avoir quelque chose de plus élégant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $this->getPeche()
       ->addPoisson('truite', 25)
       ->addPoisson('Saumon', 10)
       ->addPoisson('baleine', 30);
    Quelqu'un a t il déjà implémenter cette technique de façon optimisée ? et pourrait-il me montrer un exemple ?

    Merci d'avance pour vos réponses,
    .o0o__St@iLeR__oOo.

    Lead Developer

    ASP.NET MVC - MCP/MCSD ASP.NET
    PHP Zend Framework / PhalconPHP
    Cordova/Xamarin IOS/Android
    Kendo UI - ExtJS - JQwidgets
    SQL Server / MySQL

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 274
    Points : 15 590
    Points
    15 590
    Par défaut
    pour l'ajout en chaine, j'ai souvent vu ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $this->getPeche()->ajoutListePoisson(array(
        new Truite(25),
        new Saumon(10),
        new Baleine(30),
    ));
    et là tu as une "Fatal error: Argument must be an list of Poisson" parce que Baleine n'hérite pas de Poisson (oui je sais que c'est un exemple )

  3. #3
    Membre chevronné
    Avatar de stailer
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mars 2003
    Messages
    1 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 136
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    3
    Par défaut
    Non j'aimerais vraiment pas passer par un tableau intermédiaire...

    La solution que j'ai donc mis en place à l'heure actuelle est évidemment de retourner l'objet lui même :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public function addPoisson($type='', $nombre = 0) {
      ... code ajout ...
      return $this;
    }
    Bien sur ça marche... Mais n'y a t il pas mieux et plus optimisé que de retourner l'objet lui-même ?
    Un design pattern n'existerait-il pas par exemple ?

    (je sais qu'on ne peut pas ajouter baleine à poisson.. Mais c'était pour voir si tout le monde suivait héhé )
    .o0o__St@iLeR__oOo.

    Lead Developer

    ASP.NET MVC - MCP/MCSD ASP.NET
    PHP Zend Framework / PhalconPHP
    Cordova/Xamarin IOS/Android
    Kendo UI - ExtJS - JQwidgets
    SQL Server / MySQL

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 657
    Points : 910
    Points
    910
    Par défaut
    Citation Envoyé par stailer Voir le message
    Mais n'y a t il pas mieux et plus optimisé que de retourner l'objet lui-même ?
    Tu as un problème de performances ?
    (à cause de l'ajout de la baleine qui prend beaucoup en mémoire ? )



    Sérieusement, avant de chercher à optimiser un code, cherche d'abord à savoir si il constitue effectivement un goulot d'étranglement ... et dans ton cas à mon avis la réponse est non ...

    De mémoire, il me semble d'ailleurs que le ZendFramework utilise la même technique pour les View ($view->assign('var1', $var1)->assign('var2', $var2)->render() par exemple).
    Au passage je ne vois pas de récursivité là dedans, aucune fonction ne s'appelle elle-même
    Toute la documentation Ruby on Rails : gotapi.com/rubyrails
    Mes articles :
    > HAML : langage de template pour Ruby on Rails

  5. #5
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Points : 2 853
    Points
    2 853
    Par défaut
    L'exemple avec le Zend Framwork aurait plutot été :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Zend_Loader::loadClass('Zend_Controller_Front');
    $front = Zend_Controller_Front::getInstance()
    	->addModuleDirectory('../application/modules')
    	->throwExceptions(true)
    	->dispatch();
    J'aimerais bien savoir aussi comment faire ca.

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 657
    Points : 910
    Points
    910
    Par défaut
    Autant pour moi pour l'exemple mal choisi

    J'aimerais bien savoir aussi comment faire ca.
    Zend Framework est open-source, tu n'as qu'a regarder la source de Zend_Controller_Front :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public function throwExceptions($flag = null)
        {
            if (true === $flag) {
                $this->_throwExceptions = true;
                return $this;
            } elseif (false === $flag) {
                $this->_throwExceptions = false;
                return $this;
            }
     
            return $this->_throwExceptions;
        }
    Il suffit de retourner $this
    Toute la documentation Ruby on Rails : gotapi.com/rubyrails
    Mes articles :
    > HAML : langage de template pour Ruby on Rails

  7. #7
    Inscrit

    Profil pro
    H4X0|2 @ YourLabs Business Service
    Inscrit en
    Octobre 2006
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : H4X0|2 @ YourLabs Business Service
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 657
    Points : 909
    Points
    909
    Par défaut
    En parlant de performances, je propose une factorisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public function throwExceptions($flag = null)
        {
            if ( ! is_bool( $flag ) ) {
                 return $this->_throwExceptions;
            }
            $this->_throwExceptions = $flag;
            return $this;
        }
    J'éspère que tout le framework n'est pas codé comme cet example JK
    Surtout que la variable préfixée avec underscore fait très PHP4 ...
    YourLabs Business Service: Conseil en Strategie Numerique / Club de 1337 Haxors depuis 2012 / Marque de Logiciels Libres / Blog / GitHub /
    Citation Envoyé par C.A.R. Hoare, The 1980 ACM Turing Award Lecture
    There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies.”
    More great quotes - RIP Uriel

  8. #8
    Membre chevronné
    Avatar de stailer
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mars 2003
    Messages
    1 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 136
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    3
    Par défaut
    Taum : Oui finalement j'ai fait un retour de $this et j'arrive au même résultat que le ZF... Mais j'aime pas trop faire transiter des objets complets, il me semblait que ça bouffait de la ressource.

    Et non effectivement ce n'est pas de la récursivité, si ce n'est que dans l'esprit on envoie une fonction qui renvoie l'objet , qui envoie la fonction , qui renvoie l'objet .... etc..

    Merci pour vos réponses,
    .o0o__St@iLeR__oOo.

    Lead Developer

    ASP.NET MVC - MCP/MCSD ASP.NET
    PHP Zend Framework / PhalconPHP
    Cordova/Xamarin IOS/Android
    Kendo UI - ExtJS - JQwidgets
    SQL Server / MySQL

  9. #9
    Inscrit

    Profil pro
    H4X0|2 @ YourLabs Business Service
    Inscrit en
    Octobre 2006
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : H4X0|2 @ YourLabs Business Service
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 657
    Points : 909
    Points
    909
    Par défaut
    J'y voie un autre avantage majeur.
    Un exemple parlera de lui-meme :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $o_objet = $panier->ajouter( new $s_objet() );
    On economise une ligne dans le code, c'est toujours plus confortable puisque cela permet une meilleure lisibilité.
    YourLabs Business Service: Conseil en Strategie Numerique / Club de 1337 Haxors depuis 2012 / Marque de Logiciels Libres / Blog / GitHub /
    Citation Envoyé par C.A.R. Hoare, The 1980 ACM Turing Award Lecture
    There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies.”
    More great quotes - RIP Uriel

  10. #10
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juin 2007
    Messages : 89
    Points : 99
    Points
    99
    Par défaut
    Citation Envoyé par stailer Voir le message
    Oui finalement j'ai fait un retour de $this et j'arrive au même résultat que le ZF... Mais j'aime pas trop faire transiter des objets complets, il me semblait que ça bouffait de la ressource.
    Je pense que c'est la solution la plus simple à ton problème. Et comme le passage d'objet se fait par référence il n'y a pas de problème de ressource.

  11. #11
    Inscrit

    Profil pro
    H4X0|2 @ YourLabs Business Service
    Inscrit en
    Octobre 2006
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : H4X0|2 @ YourLabs Business Service
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 657
    Points : 909
    Points
    909
    YourLabs Business Service: Conseil en Strategie Numerique / Club de 1337 Haxors depuis 2012 / Marque de Logiciels Libres / Blog / GitHub /
    Citation Envoyé par C.A.R. Hoare, The 1980 ACM Turing Award Lecture
    There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies.”
    More great quotes - RIP Uriel

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

Discussions similaires

  1. Objet tournant sur lui-même
    Par ayla33 dans le forum Flash
    Réponses: 1
    Dernier message: 01/05/2012, 18h22
  2. créer un objet à partir de lui-même
    Par bomehc dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 17/04/2011, 15h26
  3. [POO] Un objet peut-il se détruire lui-même
    Par raoulchatigre dans le forum Langage
    Réponses: 2
    Dernier message: 23/10/2007, 16h58
  4. Rotation d'un objet sur lui-même
    Par Ninouw dans le forum OpenGL
    Réponses: 6
    Dernier message: 29/12/2006, 09h40
  5. [POO] Objet classe PHP5
    Par theskel dans le forum Langage
    Réponses: 1
    Dernier message: 08/08/2006, 10h49

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