Ces précisions étant apportées, voici donc maintenant une première version des classes nécessaires et vous constaterez en l’exécutant avec le code suivant et une version de PHP ≥ 5.4 que le client a bien payé 30 avec une carte de crédit et dispose bien de 5 verres de Chimay Bleu remplis à 75 %.

$me = new client();
$barman = new barman();
$barman
	->receiveOrder($me->order(5, 'Chimay bleu'))
	->prepareOrder()
;
$me->receiveDrinks($barman->giveDrinks());
$barman->billDrinks($me);
$me->showDrinks();

Maintenant, voyons ce qu’il se passe lorsqu’on utilise ces classes avec le code suivant :

$me = new client();
$barman = new barman();
$barman
	->receiveOrder($me->order(5, 'Chimay bleu'))
	->prepareOrder()
;
$me
	->updateOrder(0, 'Chimay bleu')
	->receiveDrinks($barman->giveDrinks())
;
$barman
	->billDrinks($me)
	->updateDrinks();
;
$me->showDrinks();

Vous constaterez que non seulement le client n’a rien payé, mais en plus, ses verres sont remplis à 10 % de 1664 !

Pourtant, il n’y a dans ce contexte aucune concurrence, aucune parallélisation, aucun fichier, aucune base de données, et toutes les propriétés des classes sont privées.

Je vous propose maintenant d’exécuter le code suivant avec ces autres classes :

$me = (new client())->order(5, 'Chimay bleu', $barman = new barman());

$barman
	->prepareOrder()
	->giveDrinks($me)
	->billDrinks($me)
;

$me->showDrinks();

Nous retrouvons le comportement de départ, puisque le client a bien payé 30 avec une carte de crédit et dispose bien de 5 verres de Chimay Bleu remplis à 75 %.

Et maintenant, je vous invite à essayer de faire en sorte avec ces classes que le client soit servi gratuitement dispose de verres remplis à 10 % de 1664 (sans toucher au code des méthodes existantes évidemment)…

Et pour ceux désirant des explications supplémentaires ou ne sont pas encore convaincu, je vous invite à lire ceci ou cela.