Enchainer les appels de fonction

Eléphant du PHP | 451 Messages

24 oct. 2011, 19:26

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...

ViPHP
xTG
ViPHP | 7331 Messages

24 oct. 2011, 19:28

Dans chaque fonction tu dois retourner l'instance ($this) pour permettre de chaîner ainsi les appels. ;)

Eléphant du PHP | 451 Messages

24 oct. 2011, 19:32

Donc juste un return $this; suffit?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

24 oct. 2011, 19:44

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();
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 451 Messages

24 oct. 2011, 20:07

Merci pour vos explications et oui je comprends mieux et je me doutais que c'était un truc du genre.

Merci ++