Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/09/2007, 20h44   #1
Membre Expert
 
Avatar de stailer
 
Homme Jean-François CAMBOT
Développeur informatique
Inscription : mars 2003
Messages : 843
Détails du profil
Informations personnelles :
Nom : Homme Jean-François CAMBOT
Âge : 34
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2003
Messages : 843
Points : 1 112
Points : 1 112
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 :
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 :
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.

Chef de projet / Développeur

Silverlight / ASP.NET MVC - MCP ASP.NET 4
Zend Framework / Ajax (Jquery et ExtJS)
Adobe Flash Builder (Flex)

Ma librairie pour faire communiquer PHP et Silverlight "à la" WCF : http://code.google.com/p/phpservices-silverlight/
stailer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/09/2007, 21h09   #2
Modérateur
 
Avatar de mathieu
 
Inscription : juin 2003
Messages : 4 893
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 4 893
Points : 4 466
Points : 4 466
pour l'ajout en chaine, j'ai souvent vu ça
Code :
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 )
__________________
Modérateur PHP
mathieu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/09/2007, 22h29   #3
Membre Expert
 
Avatar de stailer
 
Homme Jean-François CAMBOT
Développeur informatique
Inscription : mars 2003
Messages : 843
Détails du profil
Informations personnelles :
Nom : Homme Jean-François CAMBOT
Âge : 34
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2003
Messages : 843
Points : 1 112
Points : 1 112
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 :
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.

Chef de projet / Développeur

Silverlight / ASP.NET MVC - MCP ASP.NET 4
Zend Framework / Ajax (Jquery et ExtJS)
Adobe Flash Builder (Flex)

Ma librairie pour faire communiquer PHP et Silverlight "à la" WCF : http://code.google.com/p/phpservices-silverlight/
stailer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/09/2007, 23h32   #4
Membre chevronné
 
Inscription : mai 2005
Messages : 657
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 657
Points : 722
Points : 722
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
Taum est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/09/2007, 23h45   #5
Rédacteur
 
Avatar de Yoshio
 
Homme
Inscription : septembre 2005
Messages : 1 741
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : Belgique

Informations forums :
Inscription : septembre 2005
Messages : 1 741
Points : 1 497
Points : 1 497
L'exemple avec le Zend Framwork aurait plutot été :

Code :
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.
Yoshio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/09/2007, 01h51   #6
Membre chevronné
 
Inscription : mai 2005
Messages : 657
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 657
Points : 722
Points : 722
Autant pour moi pour l'exemple mal choisi

Citation:
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 :
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
Taum est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/09/2007, 08h00   #7
Inscrit
 
Avatar de is_null
 
Inscription : octobre 2006
Messages : 637
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 637
Points : 690
Points : 690
En parlant de performances, je propose une factorisation :
Code :
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 ...
__________________
Q: Dois-je haïr et cogner sur Microsoft ?
R: Non, vous n'êtes pas obligé. Non pas que Microsoft n'est pas écoeurant, mais il y avait une culture hacker bien avant Microsoft et il y en aura une bien après que Microsoft aura été de l'histoire ancienne. Toute énergie dépensée à haïr Microsoft serait mieux employée par vos compétences et votre passion. Écrivez du bon code, cela brisera suffisamment Microsoft sans polluer votre karma.
Comment devenir un hacker ? par Eric Steven Raymond
is_null est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/09/2007, 09h32   #8
Membre Expert
 
Avatar de stailer
 
Homme Jean-François CAMBOT
Développeur informatique
Inscription : mars 2003
Messages : 843
Détails du profil
Informations personnelles :
Nom : Homme Jean-François CAMBOT
Âge : 34
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2003
Messages : 843
Points : 1 112
Points : 1 112
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.

Chef de projet / Développeur

Silverlight / ASP.NET MVC - MCP ASP.NET 4
Zend Framework / Ajax (Jquery et ExtJS)
Adobe Flash Builder (Flex)

Ma librairie pour faire communiquer PHP et Silverlight "à la" WCF : http://code.google.com/p/phpservices-silverlight/
stailer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2007, 17h00   #9
Inscrit
 
Avatar de is_null
 
Inscription : octobre 2006
Messages : 637
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 637
Points : 690
Points : 690
J'y voie un autre avantage majeur.
Un exemple parlera de lui-meme :
Code php :
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é.
__________________
Q: Dois-je haïr et cogner sur Microsoft ?
R: Non, vous n'êtes pas obligé. Non pas que Microsoft n'est pas écoeurant, mais il y avait une culture hacker bien avant Microsoft et il y en aura une bien après que Microsoft aura été de l'histoire ancienne. Toute énergie dépensée à haïr Microsoft serait mieux employée par vos compétences et votre passion. Écrivez du bon code, cela brisera suffisamment Microsoft sans polluer votre karma.
Comment devenir un hacker ? par Eric Steven Raymond
is_null est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2007, 20h12   #10
Membre régulier
 
Inscription : juin 2007
Messages : 89
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : juin 2007
Messages : 89
Points : 95
Points : 95
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.
dewsz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2007, 03h42   #11
Inscrit
 
Avatar de is_null
 
Inscription : octobre 2006
Messages : 637
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 637
Points : 690
Points : 690
http://www.martinfowler.com/bliki/FluentInterface.html
__________________
Q: Dois-je haïr et cogner sur Microsoft ?
R: Non, vous n'êtes pas obligé. Non pas que Microsoft n'est pas écoeurant, mais il y avait une culture hacker bien avant Microsoft et il y en aura une bien après que Microsoft aura été de l'histoire ancienne. Toute énergie dépensée à haïr Microsoft serait mieux employée par vos compétences et votre passion. Écrivez du bon code, cela brisera suffisamment Microsoft sans polluer votre karma.
Comment devenir un hacker ? par Eric Steven Raymond
is_null est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h11.


 
 
 
 
Partenaires

Hébergement Web