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 :

[Syntaxe POO] Méthode en cascade


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2013
    Messages : 22
    Par défaut [Syntaxe POO] Méthode en cascade
    Bonjour,

    Je vais poser une question de débutant, mais il se trouve que je n'ai pas réussi à trouver de réponses malgré mes recherches.

    Dans Symfony, j'ai trouvé cette syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
    class trucController extends Controller
    {
    	$request = $this->getRequest();
    	$tag = $request->query->get('tag');
    }
    Je parle de la ligne $request->query->get('tag').

    Je souhaiterais pouvoir faire la même chose, car je trouve que ça rend le code relativement intuitif. Par exemple :
    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
    <?php
    $Template = new Template();
     
    $Template
    	->layout('global-layout.html')
    	->addScript(array
    		'jquery', 'jqueryui', 'personal-script'
    	))
    	->replaceVar(array(
    		'variable' => $variable
    	));
     
    $Template
    	->layout('diaporama.html')
    	->replaceVar(array(
     
    	))
    	->datas2layout(
    		$bdd->query('SELECT * FROM `diaporama` WHERE `id` = 2')
    	);
     
    $Template->render();
    Toutes les méthodes (addScript, replaceVar, datas2layout, etc.) s'appliquent sur respectivement layout('global-layout.html') et sur layout('diaporama.html').

    Seulement, je ne sais pas trop comment construire ma classe pour que cela puisse fonctionner ainsi. J'imagine que je dois retourner $this dans ma méthode, mais encore ? Y a-t-il des pratiques conseillées à ce niveau ?

    Dois-je faire une classe par layout et ensuite donner ladite classe comme argument à une méthode appartenant à Template ?

    Merci pour vos conseils.

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Par défaut
    D'abord, attention,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $request->query->get('tag');
    ne fait pas du tout ce que tu penses. Il n'y a pas de cascade, il n'y a qu'une seule méthode qui est appelée: get(), qui est une fonction du ParameterBag $query, lui-même une propriété de $request.

    Ensuite, comme je n'ai pas les types retournés par tes méthodes, je ne peux pas te répondre précisément sur ton cas, mais il y a deux choses:
    - il y a d'abord l'utilisation de méthode en cascade/chaînées. Une méthode d'une classe A retourne un objet B, qui elle-même possède une autre méthode méthode, ce qui donne
    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
     
    class A
    {
       public function methodA()
       {
          return new B;
       }
    }
     
    class B
    {
       public function methodB()
       {
          //faire quelque chose ici
       }
    }
    Utilisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    $a = new A;
    $a->methodA() //on obtient un objet B
      ->methodB(); // méthode qui appartient à B
    Puis il y a la technique du fluent interface, dans laquelle on utilise les méthodes chaînées, mais sur un seul et unique objet. Chaque méthode utilisée returne donc l'instance en cours de l'objet ($this).
    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
     
    class A
    {
       public function methodA()
       {
          //faire quelque chose
          return $this;
       }
     
       public function methodB()
       {
          //faire autre chose 
          return $this;
       }
    }
    Utilisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $a = new A;
    $a->methodA() //on obtient toujours l'objet A, 
      ->methodB(); // méthode qui appartient à A
    Regarde les méthodes de jQuery, en javascript pour voir à quel point ce genre de technique peut être intéressante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $( "div.first" ).slideUp( 300 ).delay( 800 ).fadeIn( 400 );
    Mais attention, ça peut être difficile à lire aussi car trop de méthodes chaînées rend le code incompréhensible. Surtout si tu mélanges méthodes chaînées ordinaires et fluent interface, et on ne sait plus qui retourne quoi.

Discussions similaires

  1. [POO] Méthodes invisibles
    Par Le Furet dans le forum Langage
    Réponses: 3
    Dernier message: 19/06/2007, 23h38
  2. [POO] POO, méthode et déplacement de DIV
    Par philippe.z dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 19/06/2007, 15h55
  3. [POO]Méthode récursive pour tester dépendances
    Par viviboss dans le forum Langage
    Réponses: 4
    Dernier message: 28/05/2007, 12h06
  4. [POO] Méthode abstraite PHP4
    Par joebarteam88 dans le forum Langage
    Réponses: 2
    Dernier message: 30/04/2007, 07h32
  5. Réponses: 4
    Dernier message: 17/03/2007, 01h06

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