Page 1 sur 1

Enchainer les appels de fonction

Posté : 24 oct. 2011, 19:26
par djtec
Bonsoir,

Alors voici mon fichier:
class A {
    
    public function start() {
        echo 'Class: A -- Function: start<br />';
    }
    
}

class B extends A {
    
    public function open() {
        echo 'Class: B -- Function: open<br />';
    }
    
    public function exec() {
        C::test();
        
        echo 'Class: B -- Function: exec<br />';
    }
    
    public function save() {
        echo 'Class: B -- Function: save<br />';
    }
    
}

class C {
    
    public static function test() {
        echo 'Class: C -- Function: test<br />';
    }
    
}

$b = new B();
$b->open()->exec()->save();
Je me demandais ce qu'il fallait faire pour que mes fonctions open, exec, save se lance l'une à la suite de l'autre car pour le moment seul la fonction open se lance.

Merci d'avance...

Re: Enchainer les appels de fonction

Posté : 24 oct. 2011, 19:28
par xTG
Dans chaque fonction tu dois retourner l'instance ($this) pour permettre de chaîner ainsi les appels. ;)

Re: Enchainer les appels de fonction

Posté : 24 oct. 2011, 19:32
par djtec
Donc juste un return $this; suffit?

Re: Enchainer les appels de fonction

Posté : 24 oct. 2011, 19:44
par zeus
Effectivement, si tu ne fait pas le return $this, rien ne se passe.
Pourquoi ? Eh bien décomposons ton code : quand tu écris ça :
$b->open()->exec();
Cela signifie que tu lances la méthode open() sur l'instance $b, puis la méthode exec() sur le retour de la méthode open()

En gros, c'est comme si tu avais écris ça :
$c = $b->open();
$c->exec();
En voyant ça, je pense que tu as maintenant compris le soucis.
La réponse à ta problématique, telle que te le propose xTG, est l'utilisation de l'interface Fluent (ou chainage), qui consiste à faire en sorte que chaque méthode retourne l'instance de l'objet (return $this;), ce qui permet de lancer plusieurs méthodes d'affilée, puisque tu retourne toujours l'objet du départ.

Si je reprend mon exemple du dessus :
$c = $b->open();
$c->exec();
Ici, $c = $b, puisque open() retourne $this, soit l'objet de base, c'est à dire $b
C'est donc comme si tu écrivais ça :
$b = $b->open();
$b->exec();
Et donc il est possible d'écrire la ligne du début :
$b->open()->exec();

Re: Enchainer les appels de fonction

Posté : 24 oct. 2011, 20:07
par djtec
Merci pour vos explications et oui je comprends mieux et je me doutais que c'était un truc du genre.

Merci ++